c++重载,覆盖,隐藏的定义与区别--------华清远见
1、重载(overload)
重载的定义为:在同一作用域中,同名函数的形式参数(参数个数、类型或者顺序)不同时,构成函数重载。例如:
class A
{
public:int func(int a);void func(int a, int b);void func(int a, int b, int c); int func(char* pstr, int a);
};
以上的四个函数均构成重载。
需要注意的是:
- 函数返回值类型与构成重载无任何关系
- 类的静态成员函数与普通成员函数可以形成重载
- 函数重载发生在同一作用域,如类成员函数之间的重载、全局函数之间的重载
对于重载,最出名的应该就是运算符重载了吧。
这里还需要注意一下 const重载:
class D
{
public:void funcA(); //1void funcA() const; //2void funcB(int a); //3void funcB(const int a); //4
};
在类D 中 funcA 与 const funcA是合法的重载,而 两个 funcB 函数是非法的,不能通过编译。
原因是:在类中,由于隐含的this形参的存在,const版本的function函数使得作为形参的this指针的类型变为指向const对象的指针,而非const版本的使得作为形参的this指针就是正常版本的指针。此处是发生重载的本质。
调用规则:const对象默认调用const成员函数,非const对象默认调用非const成员函数;
对于funcB,非引用传参,形参是否const是等价的。但是当使用引用传参时,有无const是不同的。使用指针传参时,指向const对象的指针和指向非const对象的指针做形参的函数是不同的。
2、隐藏(hiding)
隐藏定义:指不同作用域中定义的同名函数构成隐藏(不要求函数返回值和函数参数类型相同)。比如派生类成员函数隐藏与其同名的基类成员函数、类成员函数隐藏全局外部函数。
void hidefunc(char* pstr)
{cout << "global function: " << pstr << endl;
}class HideA
{
public:void hidefunc(){cout << "HideA function" << endl;}void usehidefunc(){//隐藏外部函数hidefunc,使用外部函数时要加作用域hidefunc();::hidefunc("lvlv");}
};class HideB : public HideA
{
public:void hidefunc(){cout << "HideB function" << endl;}void usehidefunc(){//隐藏基类函数hidefunc,使用外部函数时要加作用域hidefunc();HideA::hidefunc();}
};
隐藏的实质是;在函数查找时,名字查找先于类型检查。如果派生类中成员和基类中的成员同名,就隐藏掉
3、重写/覆盖(override)
重写的定义:派生类中与基类同返回值类型、同名和同参数的虚函数重定义,构成虚函数覆盖,也叫虚函数重写。
需要注意的是,这里有一个特殊情况,即协变返回类型。
定义是:如果虚函数返回指针或者引用时(不包括value语义),子类中重写的函数返回的指针或者引用是父类中被重写函数所返回指针或引用的子类型。
c++重载,覆盖,隐藏的定义与区别--------华清远见相关推荐
- c++ 重载 覆盖 隐藏的区别和执行方式
成员函数被重载的特征(1)相同的范围(在同一个类中): (2)函数名字相同: (3)参数不同: (4)virtual 关键字可有可无. 覆盖是指派生类函数覆盖基类函数,特征是 (1)不同的范围(分别位 ...
- 函数重载 覆盖 隐藏
重载overload 函数名相同,但形参的个数或形参的类型不同. 仅返回值不同,不能定义为重载函数. class Base { public:void baseFun(int) { cout < ...
- java重载覆盖隐藏_重载,覆盖以及隐藏 - osc_4dki3x9l的个人空间 - OSCHINA - 中文开源技术交流社区...
重载是指同名函数具有不同的参数表.在同一访问区域内声明的几个具有不同参数列表(参数的类型.个数.顺序不同)的同名函数,程序会根据不同的参数列来确定具体调用哪个函数.对于重载函数的调用,编译期间确定,是 ...
- 问题:1.sizeof;2.重载覆盖隐藏;3.内存管理
1-1.问:"char a[10]; int len = strlen(a);",len等于多少? 解析:strlen计算从数组a的第一个元素开始到'\0'总共有多少个字符(不包含 ...
- C++中的覆盖(重写)、重载、隐藏(重定义)、多态!
例一: 首先声明Base类型的指针指向实际类型为Derived的对象,先调用基类构造函数,再调用派生类构造函数.输出Base, Derived. base->echo(); 指针是base类型, ...
- C++ 函数重载、隐藏与覆盖的区别
代码编译运行环境:VS2017+Debug+Win32 1.函数重载(Function Overload) 1.1 定义 C++ 规定在同一作用域中,同名函数的形式参数(指参数的个数.类型或者顺序)不 ...
- 覆盖与重载与隐藏——SAP电面(3)
参考:http://man.chinaunix.net/develop/c&c++/c/c.htm#_Toc520634042 8.2.1 重载与覆盖 成员函数被重载的特征: (1)相同的范围 ...
- 深入理解成员函数的重载、隐藏、覆盖规则(二)
本文作者:islwj 本文出处:http://blog.csdn.net/islwj 声明: 本文可以不经作者同意, 任意复制, 转载, 但任何对本文的引用都请保留文章开始前三行的作者, 出处以及声明 ...
- 第九天2017/04/18(3、重载/覆盖 PK 重写/重定义、父类子类混搭风、抽象类)
1.重载/覆盖 PK 重写/重定义 [预备知识] 函数重载必须在同一个类中发生子类无法重载父类的函数,父类同名的函数将会被名称覆盖重载是在编译期间根据参数类型和个数决定函数调用重载只放在同一个类之中, ...
最新文章
- native数据类型 react_react-native中的请求数据
- day4 流程控制while 判断if
- Linux内核中的platform机制
- boost::math模块二项式分布来预测概率 抛硬币时的正面和反面的测试程序
- apache php 整合 linux,Linux下Apache、php3、MySQL的整合
- 深度卷积生成对抗网络(DCGAN)原理与实现(采用Tensorflow2.x)
- 推荐一些小而美的互联网公司
- AI人工智能服务器安装说明书,AI人工智能电脑配置及服务器双显卡的安装总结...
- AtomicReference使用场景
- 自学神经网络系列 —— 8 前馈神经网络
- 【跨境电商】EDM邮件营销完整指南(一):概念,区别与优势
- 定时任务框架APScheduler
- Windows下和Linux下VS Code与C/C++ Python Go Java Vue3 Git vim Latex开发环境搭建和配置史上最详细易懂的讲解
- 知识图谱笔记(小象学院课程)
- UE GamePlay学习笔记
- android 钉钉考勤日历,vue实现钉钉的考勤日历
- 我学ERP 之 金蝶ERP-K3_第4章 销售管理
- SpringCloud[04]Ribbon负载均衡服务调用
- 诺基亚两年裁员11044人,中国幅度最大达3500人
- vue2.x版本要点(一)
热门文章
- Web Design Toolbox: 130+ New Tools to Make You a Better and Faster Designer
- 解决java.lang.ClassNotFoundException: org.apache.axis2
- 在线外卖订餐网站市场竞争趋势分析
- 技术前沿:串口 HMI 指令集
- bitlocker解密(不知道密钥)
- 域,域控制器,活动目录
- android 设置图片随机出现-两种方式
- AtCoder 2068 すぬけ君の塗り絵 / Snuke's Coloring
- 列表的定义与基本使用!! 全部都是干货!!!!
- java reverselist_Java Collections reverse()方法与示例