4.6 继承
4.6.1 继承的基本语法
class 子类: 继承方式 父类
e:
class JavaPage : public BasePage { ... }
4.6.2 继承方式
继承方式有三种:public, protected, private
父类私有成员三种继承方式的子类都无法访问。
public继承的子类,不改变访问权限。 protected继承,都改变为protected权限 private基础,都改变为private权限。
4.6.3 继承中的对象模型
从父类继承过来的成员,哪些属于子类对象?
父类中所有非静态成员属性都会被子类继承。 父类私有成员属性也被继承,但是被隐藏了访问不到。
利用开发人员命令提示工具可以查看类属性:
在文件路径下(cd)cl /d1 reportSingleClassLayout类名 文件名
(注意拼写,cl和d1,依次是字母l和数字1)
4.6.4 继承中构造和析构顺序
实例化子类时, 先调用父类的构造函数,再调用子类的构造函数。 析构顺序和构造相反。
Base构造 Son构造 Son析构 Base析构
4.6.5 继承同名成员
子类和父类成员名相同时,
访问子类成员,直接访问。
访问父类成员,需要加作用域(Base::
)。
(名称空间)
4.6.6 继承同名静态成员
静态成员出现同名,和非静态成员处理方式一样。
4.6.7 多继承语法
一个类可以继承多个类。
语法:class 子类: 继承方式1 父类1, 继承方式2 父类2...
多继承可能会出现父类中同名成员,需要加作用域区分。
实际开发不建议使用多继承。
4.6.8 菱形继承
两个派生类继承同一个基类。 又有一个类同时继承这两个派生类。 这种继承叫菱形继承或钻石继承。
例如, 动物类。 羊类,驼类 都继承自动物类。 羊驼 继承自羊类和驼类。
这种继承会出现一个问题,二义性和重复。 例如动物类有age属性。 那么羊和驼都有age。 羊驼就会有2个age。 可以通过作用域解决二义性。
利用虚继承解决菱形继承的问题。
关键字virtual
。
class Animal{ public: int age; } class Sheep: virtual public Animal{}; class Tuo: virtual public Animal{}; classs SheepTuo: public Sheep, public Tuo{}
虚继承 原理 继承指针,指针指向同一个成员。