c++继承

# 继承

  • 面向对象编程的主要目的之一,就是提供可复用的代码,尤其是项目很庞大时,能够重用经过测试的代码比重写代码要方便很多。
    而继承就是实现代码复用的重要手段,它能够从已有的类派生出新的类,派生类继承了原有类(基类)的所有特价,包括方法。
    继承是一种非常有用的概念,继承的基本实现非常简单,但要对继承进行管理,让继承在所有情况下都能正常工作运行,就需要花一些功夫了。 下面就对继承的知识进行一下总结
1. 基本语法

从一个类派生出另外一个类时,原生类被称为基类,继承下来的类称为派生类,继承的语法很简单,如图
image
上面的A即是基类,B是派生类,继承时访问权限也会因为访问限定符而有了一些变化,
image
总结来说,私有(private)成员都不可见,而公有(public)和受保护(protected)的成员则取权限较低的继承。实际使用中,一般都使用公有继承。

2. 继承的作用域

在继承体系中,基类和派生类都有独立的作用域。
如果派生类中有和基类同名的成员,将会屏蔽对基类同名成员的直接访问,这叫做隐藏,也可以叫做重定义。(如果在派生类要调用基类的同名成员,可以指定作用域访问)。实际使用中,最好不要定义同名的成员,虽然语法可以,但比较容易混淆。
image


3. 基类和派生类对象赋值转换

派生类的对象可以赋值给基类的对象、指针或是引用。这种赋值一般被叫做切片。如同名字寓意,是将派生类对象中从基类继承过来的部分切割赋值给基类。
和内置类型的赋值转换不同,内置类型的赋值转换,中间会发生隐式类型转换产生一个临时变量。如image
其中就是因为将double赋值给c时产生了一个临时变量。
而基类的切片不同,从派生类切割为基类的过程中,并不会产生临时变量。image


4. 基类和派生类对象默认成员函数

创建派生类对象时,程序首先创建了基类对象。这意味着基类对象应该在进入派生类构造函数前就已经被创建。而初始化列表就刚好可以完成。
image

派生类的构造函数必须要调用基类的构造函数初始化属于基类的那一部分。
派生类的拷贝构造,operator=也同理,基类的部分,需要调用基类的。
派生类的析构函数则是先清理掉自己,再调用基类的析构
image


5. 友元与静态成员

继承的派生类,不会继承基类的友元函数,也就是说,基类的友元函数不能调用派生类的保护成员。
基类如果定义了静态成员,则所有派生类和基类中该成员都只有一份。

6. 多继承与菱形继承

一个派生类是可以继承多份基类的,这种被称为多继承。 有了多继承,便出现了菱形继承。image
继承的两个基类都继承了同一份基类,这就导致了A的数据被继承了两份,造成了数据冗余和二义性。而解决方法就是在第一次继承同一份基类的派生类前加入virtual,让继承的方式改为虚拟继承。
image
这时A的成员被B,C公用同一份,D对象中将A的数据放到最后,B和C中有各有一个指针,叫做虚基表指针,指向一张虚基表,虚基表中存有一个偏移量,通过偏移量找向A。


继承大概的知识就总结到这了,因为C++支持多继承,所以就出现了菱形继承这种坑,有了菱形虚拟继承,底层的实现就会变得非常复杂;
所以在实际使用中一般不要设计出菱形继承,否则在性能和复杂度上都会有缺陷;


__EOF__

本文作者小小鞠
本文链接https://www.cnblogs.com/zjj4633/p/16180101.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   小小鞠  阅读(98)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示