浅谈C++中的重载、覆盖、隐藏
来源:互联网 发布:mac下制作黑苹果u盘 编辑:程序博客网 时间:2024/06/05 16:12
在编程中我们经常使用C++中的重载、覆盖、隐藏,那么在这里简单总结下他们之间的区别。
一. 重载
重载应该是这三个中最容易理解的,其本身是面向过程中的语言特性,是不具备多态性的,只是同名函数不同返回值或者不同参数的函数。这里对重载不做多余的赘述。一般在c++中常见的是重载拷贝构造函数,重载构造函数,重载赋值运算符等等。
二. 覆盖
覆盖是面向对象中的一种特性,是多态性的具体实现,根据代码实例来理解覆盖是如何体现面向对象中的多态性的:
定义一个基类Base
class Base{public: Base(); virtual ~Base(); virtual void Cover();};Base::Base(){}Base::~Base(){}void Base::Cover(){ printf("Cover --- This is Base Class!\n");}
Base的子类ChildA
class ChildA : public Base{public: ChildA(); ~ChildA(); void Cover();};ChildA::ChildA(){}ChildA::~ChildA(){}void ChildA::Cover(){ printf("Cover --- This is Child A! \n");}
main.cpp:
int main(){ Base* A = new Base(); Base* B = new ChildA(); A->Cover(); B->Cover(); ChildA* C = new ChildA(); Base* D = static_cast<Base*>(C); C->Cover(); D->Cover(); getchar(); delete A; delete B; delete C; return 0;}
以上输出结果如下:
从以上可以看出来new操作符后面的类才是真正的对象本身,childA通过虚函数Cover()的实现对基类的Cover进行了覆盖操作,也就是child派生类向上静态转换为Base,调用Cover函数,最终也是调用的子类的方法。这就是派生类的方法对基类的方法的覆盖,也是is-a的思想。
三. 隐藏
相对于覆盖,隐藏其实是子类与基类的方法同名(形参、返回值都相同,并非重载),即子类对基类的非虚函数进行了重新定义。当我们用派生类调用同名函数时,此时调用的是子类的方法。但是转换到基类后,再次调用该方法,就是基类的方法了。
对以上基类和子类添加如下的方法:
void Base::Hide(){ printf("Hide --- This is Base Class!\n");}void ChildA::Hide(){ printf("Hide --- This is Child A! \n");}
main.cpp
int main(){ Base* A = new Base(); Base* B = new ChildA(); A->Hide(); B->Hide(); ChildA* C = new ChildA(); Base* D = static_cast<Base*>(C); C->Hide(); D->Hide(); getchar(); delete A; delete B; delete C; return 0;}
打印结果:
由以上可以看出来子类对象调用Hide方法时,调用的是自己的Hide方法,并未调用基类的Hide,这就是子类隐藏了基类的同名方法。
我们还可以看到当new出子类对象后,当该对象的类型名是子类类型名时,进行显示静态转换为基类对象后,再次调用Hide方法时,这时候调用的就是基类的方法。因为该方法并非虚函数,没有被子类覆盖,基类不可能通过虚函数表找到子类的实现。
以上就是对重载、覆盖、隐藏的简单理解。
- 浅谈C++中的重载、覆盖、隐藏
- c++(重载、覆盖、隐藏)
- c++(重载、覆盖、隐藏)
- c++(重载、覆盖、隐藏)
- c++(重载、覆盖、隐藏)
- c++(重载、覆盖、隐藏)
- c++(重载、覆盖、隐藏)
- c++(重载、覆盖、隐藏)
- c++(重载、覆盖、隐藏)
- c++(重载、覆盖、隐藏)
- c++(重载、覆盖、隐藏)
- c++(重载、覆盖、隐藏)
- c++(重载、覆盖、隐藏)
- c++(重载、覆盖、隐藏)
- c++(重载、覆盖、隐藏)
- c++(重载、覆盖、隐藏)
- 【C++】重载、覆盖、隐藏
- c++: 重载 覆盖 隐藏
- asp输出xml格式文件时的一个诡异错误及解决方法:XML declaration allowed only at the start of the document
- Python发送电子邮件.
- 实际中前后端开发数据交互是怎么样的
- Elon Musk公布特斯拉“下半场”目标:打造一个新能源公司 | 新智驾Weekly
- 乐视超级汽车智驾副总裁倪凯:为何被誉为“中国无人驾驶第一人”
- 浅谈C++中的重载、覆盖、隐藏
- leetcode5:最长回文子串
- 通过HTTP请求响应过程了解HTTP协议
- 支持向量机SVM(一)
- Understanding the JVM(三)对象的内存布局
- python—super
- 从软银本田联手打造智能汽车说开,看看AI如何造福汽车行业
- 360智能家庭总裁邓邱伟:由点及面构筑家庭生态
- MySQL与Python的交互