函数重载:
必须在同一个类中进行;
子类无法重载父类的函数,父类同名函数将被子类名称覆盖;
重载是在编译期间根据参数类型和个数决定函数的调用(静态联编)。
函数重写与重定义:
重写:
必须发生在基类和派生类之间,并且父类与子类的函数必须有完全相同的函数原型;
使用virtual关键字声明之后能够产生多态(如果不使用virtual,那叫重定义);
多态是在运行期间根据具体对象的类型决定函数调用(动态联编)。
代码分析:
1 #include2 using namespace std; 3 4 class Parent { 5 public: 6 virtual void fuc() 7 { 8 cout << "parent 无参fuc...\n"; 9 }10 virtual void fuc(int i)11 {12 cout << "parent 1参fuc...\n";13 }14 virtual void fuc(int i,int j)15 {16 cout << "parent 2参fuc...\n";17 }18 19 };20 class Child1 : public Parent21 {22 public:23 virtual void fuc(int i, int j)24 {25 cout << "child 2参fuc...\n";26 }27 virtual void fuc(int i, int j,int k)28 {29 cout << "child 3参fuc...\n";30 }31 };32 33 34 int main()35 {36 Child1 c1;37 c1.fuc();38 return 0;39 }
报错如下:
前面已经说过,子类无法重载父类函数,并且,子类同名函数会覆盖父类函数,所以,子类c1访问fuc函数,是没有参数的,编译器在child1中找到了fuc函数的名字,就不会去父类再找了,而child1类中没有提供无参数的fuc函数重载,所以报错,要想访问父类的无参fuc函数,可以加域作用符:
c1.Parent::fuc();