码迷,mamicode.com
首页 > 编程语言 > 详细

C++中重载(overload)、重写(override,也叫做“覆盖”)和重定义(redefine)的区别?

时间:2015-04-13 09:38:26      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:面试题   c++   多态   

1)重载(overload):

指函数名相同,但是它的参数表列个数或顺序,类型不同。但是不能靠返回类型来判断。

   a 相同的范围(在同一个类中)

   b 函数名字相同、 参数不同

   c virtual关键字可有可无

   d 返回值可以不同;

2) 重写(覆盖override)是指派生类函数覆盖基类函数,特征是:

   a 不同的范围,分别位于基类和派生类中

   b 函数的名字相同、 参数相同

   c 基类函数必须有virtual关键字,不能有static

   d 返回值相同(或者协变),否则报错;

   e 重写函数的访问修饰符可以不同。尽管virtualprivate的,派生类中重写改写为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)的区别?

标签:面试题   c++   多态   

原文地址:http://blog.csdn.net/happywq2009/article/details/45014511

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!