1)重载(overload):
指函数名相同,但是它的参数表列个数或顺序,类型不同。但是不能靠返回类型来判断。
a 相同的范围(在同一个类中)
b 函数名字相同、 参数不同
c virtual关键字可有可无
d 返回值可以不同;
2) 重写(覆盖override)是指派生类函数覆盖基类函数,特征是:
a 不同的范围,分别位于基类和派生类中
b 函数的名字相同、 参数相同
c 基类函数必须有virtual关键字,不能有static
d 返回值相同(或者协变),否则报错;
e 重写函数的访问修饰符可以不同。尽管virtual是private的,派生类中重写改写为public, protected也是可以的
3) 重定义(隐藏redefine)是指派生类的函数屏蔽了与其同名的基类函数,特征是:
a 不在同一个作用域(分别位于派生类与基类)
b 函数名字相同
c 返回值可以不同
d 规则:
如果派生类的函数和基类的函数同名,但是参数不同,此时,不管有无virtual,基类的函数被隐藏;
如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有vitual关键字,此时,基类的函数被隐藏。
ps: 多态性可以分为静态多态性(方法的重载,一个类)和动态多态性(方法的覆盖,有继承关系的类之间的行为)。进而多态性可以由重载和覆盖来实现。
例子:
class Base { private: <span style="color:#ff0000;">virtual</span> void display() { cout<<"Base display()"<<endl; } void say(){ cout<<"Base say()"<<endl; } public: void exec(){ display(); say(); } void f1(string a) { cout<<"Base f1(string)"<<endl; } void f1(int a) { cout<<"Base f1(int)"<<endl; } //<span style="color:#ff0000;">overload,两个f1函数在Base类的内部被重载</span> }; class DeriveA:public Base{ public: void display() { cout<<"DeriveA display()"<<endl; } //<span style="color:#ff0000;">override,基类中display为虚函数,故此处为重写</span> void f1(int a,int b) { cout<<"DeriveA f1(int,int)"<<endl; } //<span style="color:#ff0000;">redefine,f1函数在Base类中不为虚函数,故此处为重定义</span> void say() { cout<<"DeriveA say()"<<endl; } //<span style="color:#ff0000;">redefine,同上</span> }; class DeriveB:public Base { public: void f1(int a) { cout<<"DeriveB f1(int)"<<endl; } //<span style="color:#ff6666;">redefine,重定义</span> }; int main(){ DeriveA a; Base *b=&a; b->exec(); //display():version of DeriveA call(polymorphism) //say():version of Base called(allways ) <span style="color:#ff0000;">b里边的函数display被A类覆盖,但是say还是自己的</span>。 a.exec(); //same result as last statement a.say(); DeriveB c; c.f1(1); //version of DeriveB called }
执行结果:
DeriveA display()
Base display()
DeriveA display()
Base display()
DeriveA display()
DeriveB f1(int)
参考链接:
http://blog.163.com/clevertanglei900@126/blog/static/111352259201102441934870/
http://www.cnblogs.com/kevinGaoblog/archive/2012/08/25/2656989.html
C++中重载(overload)、重写(override,也叫做“覆盖”)和重定义(redefine)的区别?
原文地址:http://blog.csdn.net/happywq2009/article/details/45014511