C++继承
继承是面向对象的三大特性:封装、继承、多态之一
继承的概念
我们发现,定义这些类时,下级别的成员除了拥有上一级的共性,还有自己的特性。
这个时候我们就可以考虑利用继承的技术,减少重复代码。
继承的好处:可以减少重复的代码( 后续文章还有多态等好处)
class A : public B;
A 类称为子类 或 派生类
B 类称为父类 或 基类
派生类中的成员,包含两大部分:
一类是从基类继承过来的,一类是自己增加的成员。
从基类继承过过来的表现其共性,而自己本身子类新增的成员体现了其个性。
继承的总结性
继承的语法:class 子类 : 继承方式 父类
继承方式一共有三种:
- 公共继承
- 保护继承
- 私有继承
1、父类的共有继承,保护继承,才可被子类继承。父类的私有子类继承不了。
2、按照子类继承的顺序,按照等级私有继承>保护继承>共有继承,为准,级别越来越低。
3、访问权限:共有的属性可以被类外和任何类访问;父类保护的属性子类可以访问;私有的属性必须要在本类内访问(级别最高)。
4、 父类中私有成员也是被子类继承下去了,只是由编译器给隐藏后访问不到。(子类占用内存=自己的成员属性内存+父类的所有属性内存)
5、继承中先调用父类构造函数,再调用子类构造函数,析构顺序与构造相反。(栈区先进后出)
6、父子同名成员时(非静态成员)
(1)子类对象可以直接访问到子类中同名成员(默认是直接访问子类的)
(2)子类对象加作用域可以访问到父类同名成员
(3)当子类与父类拥有同名的成员函数,子类会隐藏父类中同名成员函数,加作用域可以访问到父类中同名函数
7、继承中同名的静态成员(static)在子类对象时(静态成员)(静态是在另外的存储区域****,编译阶段就准备好了,大家共用的,用到了的话直接复制出来到堆用)
(1)同名静态成员处理方式和非静态处理方式一样,只不过有两种访问的方式(通过对象 和 通过类名)通过对象,和上面6是一样的。
(2)通过类名,Son::Base::func();第一个冒号表示是在子类类名访问,第二个冒号是在子类继承的父类作用域中。
8、C++允许一个类继承多个类
语法:class 子类 :继承方式 父类1 , 继承方式 父类2...
多继承可能会引发父类中有同名成员出现,需要加作用域区分
C++实际开发中不建议用多继承
总结: 多继承中如果父类中出现了同名情况,子类使用时候要加作用域
9、菱形继承问题:
菱形继承概念:
两个派生类继承同一个基类
又有某个类同时继承者两个派生类
这种继承被称为菱形继承,或者钻石继承
描述:孙子继承儿子1和儿子2,儿子1和儿子2又继承父亲。(并且此时有相同的成员属性)
为什么不用:此时会产生二义性,浪费空间,没意义,孙子同时继承了儿子1和儿子2的属性。实际只需要一份数据,不需要两份数据。
解决:使用虚继承来解决。(继承父亲前加上修饰virtual)
对应有个指针指向虚继承表。
本文地址:https://blog.csdn.net/m0_46332224/article/details/107679629