C++成员函数重载、覆盖和隐藏的区别
***************************************************
更多精彩,欢迎进入:http://shop115376623.taobao.com
***************************************************
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++成员函数重载、覆盖和隐藏的区别相关推荐
- C++子类父类成员函数的覆盖和隐藏实例详解
https://www.jb51.net/article/117380.htm 函数的覆盖 覆盖发生的条件: (1) 基类必须是虚函数(使用virtual 关键字来进行声明) (2)发生覆盖的两个函数 ...
- 关于C++子类父类成员函数的覆盖和隐藏
转载:http://blog.csdn.net/worldmakewayfordream/article/details/46827161 函数的覆盖 覆盖发生的条件: (1) 基类必须是虚函数(使用 ...
- C++类成员函数重载问题
C++类成员函数重载问题 #include <iostream> using namespace std; class A {private: int a;int b; public:A( ...
- 用友元函数重载乘法,用成员函数重载除法
#include<iostream> using namespace std; class Complex {private:int real;//记录实部; int imag;//记录虚 ...
- C++用友元成员函数重载运算符,实现+-的重载使之适用复数计算
/*用友元成员函数重载运算符,实现+-的重载使之适用复数计算 */ #include<iostream> using namespace std; class complex{ priva ...
- (P22)运算符重载:运算符重载 ,成员函数重载 ,非成员函数重载 ,运算符重载规则
文章目录 1.运算符重载 2.成员函数重载 3.非成员函数重载 4.运算符重载规则 1.运算符重载 运算符重载允许把标准运算符(如+.-.*./.<.>等)应用于自定义数据类型的对象 直观 ...
- java 覆盖和隐藏_Java方法的覆盖与隐藏的区别分析
本篇文章介绍了,关于Java方法的覆盖与隐藏的区别分析.需要的朋友参考下 关于隐藏和覆盖的区别,要提到RTTI(run-time type identification)(运行期类型检查),也就是运行 ...
- 《C++成员函数重载、覆盖与隐藏》
<成员函数的重载.覆盖与隐藏> ------------------------------------------------------------------------------ ...
- C++中类成员函数的重载、覆盖和隐藏的区别,超清楚!
转载:https://www.cnblogs.com/liubo1/p/5925746.html 1.成员函数被重载的特征: (1)相同的范围(在同一个类中): (2)函数名字相同: (3)参数不同: ...
最新文章
- redmine忘记username和password
- 天池赛题解析:零基础入门语义分割-地表建筑物识别-CV语义分割实战(附部分代码)
- hdu 1203 I NEED A OFFER!
- mysql blob key length_mysql – 没有密钥长度的密钥规范中使用的BLOB / TEXT列’bestilling’...
- 处理时间_6_SQL Server常见的时间格式转换
- c语言程序设计现代方法第二版 第10章程序设计题3题,自己编写的一个程序
- java捕捉音频,如何捕获在Java中的音频数据
- Java开发中如何用JDBC连接起数据库?
- LamBda学习(一)
- ASN.1编解码:asn1c-ORAN-E2AP
- bzoj 1651: [Usaco2006 Feb]Stall Reservations 专用牛棚【贪心+堆||差分】
- 解析Java对象的equals()和hashCode()的使用
- 向视图中插入的数据能进入到基本表中去吗?_数据库调优,调的是什么及常见手法...
- mysql批量导出_mysql批量导出导入
- excel转置怎么操作_数据粘贴只会Ctrl+C就out了,五种选择性粘贴方法,让操作更高效...
- RMAN-06004 RMAN-20003
- pyecharts画世界地图时显示为中文之世界各国中英文国名对照
- matlab计算轮廓曲率半径,【转】求最小曲率半径matlab源程序
- java怎样断开http请求_http post请求管道断开
- Meta首份元宇宙白皮书9大看点,瞄准80万亿美元市场
热门文章
- [云框架]KONG API Gateway v1.5 -框架说明、快速部署、插件开发
- 在云服务器上注意GeoServer和ShadowDataMap的跨域设置
- Spring Boot—07应用application.properties中的配置
- org.apache.jasper.JasperException: Unable to compile class for JSP:
- openjudge 14:求10000以内n的阶乘
- 23期PHP基础班第四天
- 8月12号=》391页-395页
- android关于socket编程,以聊天为例【转】http://hi.baidu.com/yaoyuanhuajx/item/9b93d7565f315ba9acc857d7...
- 老陈学 C++ 序列之二: 友元函数
- WIN2003设完C盘权限后终端连不上。