继承
一、基本语法
class SuperClass{
};
class SubClass : public SuperClass{
};
二、继承方式
class SubClass : public SuperClass1,public SuperClass2{
};
代码里的public就是这个子类继承父类的继承方式
两个父类中有同名成员时用作用域区分
继承方式的分类
父类的私有,所有继承都无法访问
- 公共继承
继承父类中除私有外的所有,且继承内容的权限都和父类保持一致 - 保护继承
继承父类中除私有外的所有,且继承内容的权限都变为protected - 私有继承
继承父类中除私有外的所有,且继承内容的权限都变为private
三、继承中的对象模型
子类继承了父类所有非静态成员属性都会被子类继承下去
父类中的私有成员属性只是被编译器隐藏了,是访问不到,不是没有继承
四、构造和析构顺序
1、父类的构造函数
2、子类的构造函数
3、子类的析构函数
4、父类的析构函数
五、同名成员处理
当子类与父类出现同名的成员时,
- 访问子类同名成员——>直接访问即可
- 访问父类同名成员——>需要加作用域(子类对象名.父类名::属性名)
子类对象名后面有一个点
子类的同名成员函数会隐藏掉父类中所有的同名函数(即重载函数也无法通过参数不同调用),如果想访问父类中被隐藏的同名函数需要加作用域
六、同名静态成员处理方式
问题:当子类与父类出现同名的成员,如何通过子类对象,访问到子类或父类中同名的数据
方法一:
- 访问子类同名成员 直接访问即可
- 访问父类同名成员 需要加作用域
和上述同名成员的处理方式一样
方法二:
静态成员可以直接通过类名访问
-
子类中的静态成员: 子类名::静态成员名
-
父类中的静态成员: 父类名::静态成员名
或者 子类名::父类名::静态成员名(第一个::表示通过类名访问,第二个::表示找的是父类作用域下的::)
七、菱形继承(钻石继承)
概念
两个派生类继承同一个基类
又有某个类同时继承者两个派生类
问题
-
羊继承了动物的数据,驼同样继承了动物的数据,当草泥马使用数据时,就会产生二义性。
-
草泥马继承自动物的数据继承了两份,其实我们应该清楚,这份数据我们只需要一份就可以。
解决方法
利用虚继承
在继承语法中加入virtual关键字
被virtual修饰的父类被称为虚基类
(若B,C都是A的子类,E是B,C的子类,通常把A修饰成虚基类)
此时B,C中的同名成员(从A中继承下来的)共用一个内存,所以会被同时修改
class 子类名:virtual public 父类名{};