类成员函数的重载、覆盖和隐藏区别 (C++)(转)
类成员函数的重载、覆盖和隐藏区别 (C++)
这是本人第一次写博客,主要是想记录自己的学习过程、心得体会,一是可以方便以后回顾相关知识,二是可以与大家相互学习交流。
关于C++中类成员函数的重载、覆盖和隐藏区别,第一次看到这个问题是在准备找工作的时候在牛客网中(http://www.nowcoder.com/questionTerminal/266d3a6d4f1b436aabf1eff3156fed95)看到的,后来也有遇到一些题在考察这个知识点,只要理解了他们的区别,还是可以正确的解答有关这个知识点的题。看到牛客网中有大牛的解释很好,故摘录保存。
1.成员函数被重载的特征:overload
(1)相同的范围(在同一个类中);
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无。
2.覆盖是指派生类函数覆盖基类函数,特征是:override/overwrite
(1)不同的范围(分别位于派生类与基类);
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有virtual 关键字。
3.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:hide
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆:作用域不同)。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆:有没有)。
有关重载,应该是很好理解的(在同一个类中,函数名相同,函数的参数类型和个数不同),此处不予更多的说明,对于覆盖和隐藏(主要在基类和派生类中体现),借助下面这个例子来直观的说明:
#include<iostream>
using namespace std; class People {
public:
// 隐藏:是指派生类的函数屏蔽基类函数
// 隐藏规则1:
// 1) 函数名相同 && 参数不同
// 2) virtual不影响
void getId_different_params() {cout << "People::getId_different_params" << endl;}
virtual void getName_different_params() {cout << "People::getName_different_params" << endl;} // 隐藏规则2:
// 1) 函数名相同 && 参数相同
// 2) 无virtual
void getPhone_same_params() {cout << "People::getPhone_same_params" << endl;} // 覆盖规则:
// 1) 函数名相同 && 参数相同
// 2) 有virtual
virtual void getAddress_same_params() {cout << "People::getAddress_same_params" << endl;}
}; class Children : public People {
public:
// 隐藏:是指派生类的函数屏蔽基类函数
// 隐藏规则1:
// 1) 函数名相同 && 参数不同
// 2) virtual不影响
void getId_different_params(int) {cout << "Children::getId_different_params(int)" << endl;}
virtual void getName_different_params(int) {cout << "Children::getName_different_params(int)" << endl;} // 隐藏规则2:
// 1) 函数名相同 && 参数相同
// 2) 无virtual
void getPhone_same_params() {cout << "Children::getPhone_same_params" << endl;} // 覆盖规则:
// 1) 函数名相同 && 参数相同
// 2) 有virtual
virtual void getAddress_same_params() {cout << "Children::getAddress_same_params" << endl;}
}; int main()
{
Children *c = new Children();
c->getId_different_params();
/*由于被隐藏,所以编译时找不到对应函数
c->getName_different_params();
c->getId_different_params();
*/
c->getName_different_params();
c->getId_different_params();
c->getName_different_params();
c->getPhone_same_params();
c->getAddress_same_params();
/*输出为:
Children::getId_different_params(int)
Children::getName_different_params(int)
Children::getPhone_same_params
Children::getAddress_same_params
*/ People *p = new Children();
p->getId_different_params();
p->getName_different_params();
p->getPhone_same_params();
p->getAddress_same_params(); /*输出为:
People::getId_different_params //由于子类中的函数只是隐藏了基类中的函数而没有覆盖,因为指针为基类指针,故调用基类函数
People::getName_different_params //由于子类中的函数只是隐藏了基类中的函数而没有覆盖,因为指针为基类指针,故调用基类函数
People::getPhone_same_params //由于子类中的函数只是隐藏了基类中的函数而没有覆盖,因为指针为基类指针,故调用基类函数
Children::getAddress_same_params // 由于子类中的函数覆盖了基类中的函数,虽然指针为基类指针,但是会调用子类函数
*/ return ;
}
类成员函数的重载、覆盖和隐藏区别 (C++)(转)的更多相关文章
- C++类成员函数的重载、覆盖和隐藏区别?
C++类成员函数的重载.覆盖和隐藏区别? a.成员函数被重载的特征:(1)相同的范围(在同一个类中):(2)函数名字相同:(3)参数不同:(4)virtual 关键字可有可无.b.覆盖是指派生类函数覆 ...
- C++:类成员函数的重载、覆盖和隐藏区别?
#include <iostream> class A { public: void func() { std::cout << "Hello" <& ...
- 【非原创】C++类成员函数的重载、覆盖和隐藏
链接:https://www.nowcoder.com/questionTerminal/266d3a6d4f1b436aabf1eff3156fed95来源:牛客网 题目:类成员函数的重载.覆盖和隐 ...
- C++类成员函数的 重载、覆盖和隐藏区别
重载:成员函数被重载的特征: (1)相同的范围(在同一个类中): (2)函数名字相同: (3)参数不同: (4)virtual 关键字可有可无. #include <iostream> u ...
- 类成员函数的重载、覆盖和隐藏区别 (C++)
这是本人第一次写博客,主要是想记录自己的学习过程.心得体会,一是可以方便以后回顾相关知识,二是可以与大家相互学习交流. 关于C++中类成员函数的重载.覆盖和隐藏区别,第一次看到这个问题是在准备找工作的 ...
- 成员函数的重载&&隐藏&&覆盖
/* *成员函数的重载,覆盖,隐藏 *重载: *1.同样的范围(在同一个类中) *2.函数名同样 *3.參数不同 *4.virtualkeyword可有可无 *覆盖是指派生类覆盖基类的函数,特征是: ...
- c++类成员函数的重载和覆盖有什么区别
1.成员函数被重载的特征: (1)相同的范围(在同一个类中): (2)函数名字相同: (3)参数不同: (4)virtual 关键字可有可无. 2.覆盖是指派生类函数覆盖基类函数,特征是: (1)不同 ...
- C++继承具体解释之二——派生类成员函数具体解释(函数隐藏、构造函数与兼容覆盖规则)
在这一篇文章開始之前.我先解决一个问题. 在上一篇C++继承详解之中的一个--初探继承中,我提到了在派生类中能够定义一个与基类成员函数同名的函数,这样派生类中的函数就会覆盖掉基类的成员函数. 在谭浩强 ...
- C++函数的重载、覆盖和隐藏区别
a.成员函数被重载的特征:(1)相同的范围(在同一个类中)(2)函数名字相同(3)参数不同(4)virtual 关键字可有可无b.覆盖是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生 ...
随机推荐
- mac下无法远程桌面连接win10的解决办法
原文链接:http://www.hangge.com/blog/cache/detail_899.html 原来在Mac OSX下远程win7系统很正常,后来把windows系统升级成了win10,再 ...
- Poj 1338 Ugly Numbers(数学推导)
一.题目大意 本题要求写出前1500个仅能被2,3,5整除的数. 二.题解 最初的想法是从1开始检验该数是否只能被2,3,5整除,方法是这样的,对于一个数,如果它能被2整除,就除以2,如果它能被3整除 ...
- HDOJ1272(并查集,判断是否为树)
0 0 Yes 1 1 0 0 Yes 1 2 2 1 0 0 No //自回路不算一条边的! 居然有 0 0 这样的测试数据 #include<iostream> #include< ...
- css中的块级和内联元素
块级元素: 首先说明display是块级元素,会单独站一行,如 代码: <!DOCTYPE html> <html> <head lang="en"& ...
- UML核心元素--边界
定义:边界是无形的,是可大可小的,同时参与者.用例和边界又有着相生相克的性质.与其说边界是UML元素,还不如说它是一种分析方法. 1.需求是动态的过程:系统边界是无形的,看不到的,不好理解,倒不如说需 ...
- WPF Invoke与BeginInvoke的区别
Control.Invoke 方法 (Delegate) :在拥有此控件的基础窗口句柄的线程上执行指定的委托. Control.BeginInvoke 方法 (Delegate) :在创建控件的基础句 ...
- java中的接口和抽象类的区别
1.接口从用户的角度(使用实现的代码)看问题. 2.接口由编译器强制的一个模块间协作的合约. 3.无成员变量. 4.成员函数只能声明不能实现,(jdk1.8中的default 方法可以有方法体). 接 ...
- Mybaits整合Spring自动扫描 接口,Mybaits配置文件.xml文件和Dao实体类
1.转自:https://blog.csdn.net/u013802160/article/details/51815077 <?xml version="1.0" enco ...
- p1098 逆序对
传送门 题目 输入格式: 第一行,一个数n,表示序列中有n个数. 第二行n个数,表示给定的序列. 输出格式: 给定序列中逆序对的数目. 数据范围: 对于50%的数据,n≤2500 对于100%的数据, ...
- linux 的 scp 命令
linux 的 scp 命令 可以 在 linux 之间复制 文件 和 目录: ================== scp 命令 ================== scp 可以在 2个 linu ...