函数重载即2个函数名称相同但功能不同如:
int f(int a,int b)double f(double a,double b)int f(int a)
不可以只是返回类型不同如:
int f(int a,int b)double f(int a,int b)
下面定义一个基类:CBase,它的函数f声明位虚函数,它的继承类cderived分别重载函数f和g
#includeusing namespace std;class CBase{ public: virtual void f(int x){ printf("case::f %d\n",x);//定义虚函数 f(关键字virtual) } void g(float x){ printf("case::g %f\n",x); }};class cderived:public CBase{//CBase的继承类cderived public: void f(int x){ printf("cderived::f %d\n",x);//重载函数f } void g(float x){ printf("cderived::g %f\n",x);//重载函数g }};int main(){ cderived derivedobj; derivedobj.f(3);//执行继承类的f函数 derivedobj.g(6.0f);//执行继承类的g函数 CBase* p=&derivedobj; p->f(3);//执行继承类的f函数 p->g(6.0f);//实际执行的是基类的g函数 return 0;}
打印结果为:
cderived::f 3cderived::g 6.000000cderived::f 3case::g 6.000000 可以看出来实际执行的是基类CBase的g函数
因为基类CBase的函数f为virtual虚函数,而继承类重载了函数,使其基类的f函数实际成为了继承类的f函数,利用转化为基类的对象p来调用f函数,仍然是继承类本身的函数;
所以如果允许继承类的重载函数修改基类的函数,就在基类中将其定义为virtual虚函数;
如果直接用基类的对象来调用
int main(){ CBase a; cderived derivedobj; derivedobj.f(3); derivedobj.g(6.0f); CBase* p=&a; p->f(3); p->g(6.0f); return 0;}
其打印结果为:
cderived::f 3cderived::g 6.000000case::f 3case::g 6.000000