***************************************************

更多精彩,欢迎进入:http://shop115376623.taobao.com

***************************************************

C++成员函数重载、覆盖和隐藏的区别

class Base
{
  public:
void Walk(int x){ cout <<"Base::Walk(int)"<< endl; }
void Walk(float x){cout<<"Base::Walk(float)"<<endl;}
virtual void Run(void){cout<<"Base::Run(void)"<<endl;}
};

class Derived: public Base
{
public:
virtual void Run(void){cout<<"Derived::Run(void)"<<endl;}
};

// 如上关系是: Base::Walk(float)和Base::Walk(int)是函数重载关系
               Derived::Run(void)覆盖了Base::Run(void),而不是虚函数重载

int main()
{
Derived der;
Base *pb = &der;
pb->Walk(20);      // 调用 Base::Walk(int)
pb->Walk(1.2f);    // 调用 Base::Walk(float)
pb->Run();         // 调用 Derived::Run(void)
return 0;
}
如果使用pb->Walk(1.2)的话(即参数为double类型)则编译无法通过
原因是double转换为int和float都是合理的,但两者同时存在导致二义性,编译无法通过

下面介绍重载和覆盖的区别
重载函数被重载的特征:
1. 具有相同的作用域
2. 函数名字相同
3. 参数类型、 顺序或数目不同
覆盖派生类重新实现基类的成员函数,其特征是:
1. 不同作用域
2. 函数完全相同(包括函数名称和参数列表)
3. 基类函数必须是虚函数

经常听到的“虚函数重载”这一说法是不正确的,应该是覆盖,“虚函数重载”实质上是告诉编译器将函数指针
替换重父类继承下来虚函数列表的对象项而实现,这么觉得还是翻译成覆盖比较合适

class Base
{
  public:
virtual void Walk(float x){ cout <<"Base::Walk(float)"<< endl; }
void Run(float x){cout<<"Base::Run(float)"<<endl;}
void Jump(float x){cout<<"Base::Jump(float)"<<endl;}

};

class Derived: public Base
{
public:
virtual void Walk(float x){ cout <<"Derived::Walk(float)"<< endl; }
void Run(int x){cout<<"Derived::Run(int)"<<endl;}
void Jump(float x){cout<<"Derived::Jump(float)"<<endl;}
};
如上的关系是 Derived::Walk(float)覆盖了函数Base::Walk(float)
             Derived::Run(int) 隐藏了Base::Run(int),Derived::Jump(float)隐藏了Base::Jump(float)
而不是重载(不在同一个作用域内),也不是覆盖,因为函数不是虚函数
class Base
{
  public:
virtual void Walk(){ cout <<"Base::Walk()"<< endl; }
   void Run(float x){cout<<"Base::Run(float)"<<endl;}

};

class Derived: public Base
{
public:
virtual void Walk(int x){ cout <<"Derived::Walk(int)"<< endl; }
void Run(int x){cout<<"Derived::Run(int)"<<endl;}
};

int main()
{
Derived der;
Derived* pd = &der;
pd->Run(1);       // 调用Derived::Run(int)
pd->Run(1.2f);    // 调用Derived::Run(int)   证明Base::Run(float)被隐藏
pd->Walk(1);      //  Derived::Run(int)"
// pd->Walk();编译无法通过,函数被隐藏
Base *pb = &der;
pb->Run(1);       // 调用Base::Run(float)
pb->Run(1.2f);    // 调用Base::Run(float) 
pb->Walk();
// pd->Walk(1);编译无法通过,函数被隐藏
return 0;
}

C++成员函数重载、覆盖和隐藏的区别相关推荐

  1. C++子类父类成员函数的覆盖和隐藏实例详解

    https://www.jb51.net/article/117380.htm 函数的覆盖 覆盖发生的条件: (1) 基类必须是虚函数(使用virtual 关键字来进行声明) (2)发生覆盖的两个函数 ...

  2. 关于C++子类父类成员函数的覆盖和隐藏

    转载:http://blog.csdn.net/worldmakewayfordream/article/details/46827161 函数的覆盖 覆盖发生的条件: (1) 基类必须是虚函数(使用 ...

  3. C++类成员函数重载问题

    C++类成员函数重载问题 #include <iostream> using namespace std; class A {private: int a;int b; public:A( ...

  4. 用友元函数重载乘法,用成员函数重载除法

    #include<iostream> using namespace std; class Complex {private:int real;//记录实部; int imag;//记录虚 ...

  5. C++用友元成员函数重载运算符,实现+-的重载使之适用复数计算

    /*用友元成员函数重载运算符,实现+-的重载使之适用复数计算 */ #include<iostream> using namespace std; class complex{ priva ...

  6. (P22)运算符重载:运算符重载 ,成员函数重载 ,非成员函数重载 ,运算符重载规则

    文章目录 1.运算符重载 2.成员函数重载 3.非成员函数重载 4.运算符重载规则 1.运算符重载 运算符重载允许把标准运算符(如+.-.*./.<.>等)应用于自定义数据类型的对象 直观 ...

  7. java 覆盖和隐藏_Java方法的覆盖与隐藏的区别分析

    本篇文章介绍了,关于Java方法的覆盖与隐藏的区别分析.需要的朋友参考下 关于隐藏和覆盖的区别,要提到RTTI(run-time type identification)(运行期类型检查),也就是运行 ...

  8. 《C++成员函数重载、覆盖与隐藏》

    <成员函数的重载.覆盖与隐藏> ------------------------------------------------------------------------------ ...

  9. C++中类成员函数的重载、覆盖和隐藏的区别,超清楚!

    转载:https://www.cnblogs.com/liubo1/p/5925746.html 1.成员函数被重载的特征: (1)相同的范围(在同一个类中): (2)函数名字相同: (3)参数不同: ...

最新文章

  1. redmine忘记username和password
  2. 天池赛题解析:零基础入门语义分割-地表建筑物识别-CV语义分割实战(附部分代码)
  3. hdu 1203 I NEED A OFFER!
  4. mysql blob key length_mysql – 没有密钥长度的密钥规范中使用的BLOB / TEXT列’bestilling’...
  5. 处理时间_6_SQL Server常见的时间格式转换
  6. c语言程序设计现代方法第二版 第10章程序设计题3题,自己编写的一个程序
  7. java捕捉音频,如何捕获在Java中的音频数据
  8. Java开发中如何用JDBC连接起数据库?
  9. LamBda学习(一)
  10. ASN.1编解码:asn1c-ORAN-E2AP
  11. bzoj 1651: [Usaco2006 Feb]Stall Reservations 专用牛棚【贪心+堆||差分】
  12. 解析Java对象的equals()和hashCode()的使用
  13. 向视图中插入的数据能进入到基本表中去吗?_数据库调优,调的是什么及常见手法...
  14. mysql批量导出_mysql批量导出导入
  15. excel转置怎么操作_数据粘贴只会Ctrl+C就out了,五种选择性粘贴方法,让操作更高效...
  16. RMAN-06004 RMAN-20003
  17. pyecharts画世界地图时显示为中文之世界各国中英文国名对照
  18. matlab计算轮廓曲率半径,【转】求最小曲率半径matlab源程序
  19. java怎样断开http请求_http post请求管道断开
  20. Meta首份元宇宙白皮书9大看点,瞄准80万亿美元市场

热门文章

  1. [云框架]KONG API Gateway v1.5 -框架说明、快速部署、插件开发
  2. 在云服务器上注意GeoServer和ShadowDataMap的跨域设置
  3. Spring Boot—07应用application.properties中的配置
  4. org.apache.jasper.JasperException: Unable to compile class for JSP:
  5. openjudge 14:求10000以内n的阶乘
  6. 23期PHP基础班第四天
  7. 8月12号=》391页-395页
  8. android关于socket编程,以聊天为例【转】http://hi.baidu.com/yaoyuanhuajx/item/9b93d7565f315ba9acc857d7...
  9. 老陈学 C++ 序列之二: 友元函数
  10. WIN2003设完C盘权限后终端连不上。