文章引用自:http://blog.163.com/clevertanglei900@126/blog/static/111352259201102441934870/

重载overload:是函数名相同,参数列表不同 重载只是在类的内部存在。但是不能靠返回类型来判断。
重写override:也叫做覆盖。子类重新定义父类中有相同名称和参数的虚函数。函数特征相同。但是具体实现不同,主要是在继承关系中出现的 。
重写需要注意:
1 被重写的函数不能是static的。必须是virtual的
2 重写函数必须有相同的类型,名称和参数列表
3 重写函数的访问修饰符可以不同。尽管virtual是private的,派生类中重写改写为public,protected也是可以的
 

重定义 (redefining)也叫做隐藏:

子类重新定义父类中有相同名称的非虚函数 ( 参数列表可以不同 ) 。

如果一个类,存在和父类相同的函数,那么,这个类将会覆盖其父类的方法,除非你在调用的时候,强制转换为父类类型,否则试图对子类和父类做类似重载的调用是不能成功的。 

class Base {
private:
virtual 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; } //overload,两个f1函数在Base类的内部被重载
};

class DeriveA:public Base{
public:
void display() { cout<<"DeriveA display()"<<endl; } //override,基类中display为虚函数,故此处为重写
void f1(int a,int b) { cout<<"DeriveA f1(int,int)"<<endl; } //redefining,f1函数在Base类中不为虚函数,故此处为重定义
void say() { cout<<"DeriveA say()"<<endl; } //redefining,同上
};

class DeriveB:public Base
{
public:
void f1(int a) { cout<<"DeriveB f1(int)"<<endl; } //redefining,重定义
};

int main(){
DeriveA a;
Base *b=&a;
b->exec(); //display():version of DeriveA call(polymorphism) //say():version of Base called(allways )

b里边的函数display被A类覆盖,但是say还是自己的。

a.exec(); //same result as last statement   
a.say();
DeriveB c;
c.f1(1); //version of DeriveB called
}

 综上所述,总结如下:

1 成员函数重载特征:
   a 相同的范围(在同一个类中,或者同为全局的,总之,在同一个作用域中)
   b 函数名字相同
   c 参数不同
   d virtual关键字可有可无
2 重写(覆盖)是指派生类函数覆盖基类函数,特征是:
   a 不同的范围,分别位于基类和派生类中
   b 函数的名字相同
   c 参数相同
   d 基类函数必须有virtual关键字
3 重定义(隐藏)是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
   a 如果派生类的函数和基类的函数同名,但是参数不同,此时,不管有无virtual,基类的函数被隐藏。
   b 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有vitual关键字,此时,基类的函数被隐藏。

最新文章

  1. ASP.NET 字符编码的那些事
  2. Play Framework 完整实现一个APP(十一)
  3. IP地址
  4. 大数据导致DataReader.Close超时的异常
  5. BestCoder9 1003 Revenge of kNN(hdu 4995) 解题报告
  6. yii2.0根据query查看sql语句
  7. PKUSC2016滚粗记
  8. Python datetime之timedelta
  9. Python内置函数(53)——setattr
  10. Java 枚举 的学习
  11. [转载] apache ab压力测试报错(apr_socket_recv: Connection reset by peer (104))
  12. Python模块——PrettyTable 模块
  13. C#6.0特性与vs2015
  14. 【转】使用Log4Net进行日志记录
  15. 解决 canvas 将图片转为base64报错
  16. canu软件文献
  17. 基于python2【重要】怎么自行搭建简单的web服务器
  18. Linux 常用的压缩命令有 gzip 和 zip
  19. MySQL--查询表统计信息
  20. leetcode-896-单调数列

热门文章

  1. AdapterView及其子类之二:使用ListActivity及ArrayAdapter创建列表
  2. http协议分析工具
  3. hadoop的hdfs文件操作实现上传文件到hdfs
  4. sudo apt-get install lib32stdc++6
  5. PHP strpos() 函数
  6. SqlServer按照指定顺序对字段进行排序
  7. RotatingDoughnut
  8. Centos部署nagios+apache实现服务器监控
  9. [ZZ]良好的编码习惯
  10. Bootstrap的Affix与ScrollSpy用法 bootstrap-scrollspy &amp;&amp; bootstrap-dropdown