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{}

虚继承 原理 继承指针,指针指向同一个成员。