1虚基类的作用

如果一个派生类有多个直接基类,而直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多份同名成员,虚基类就是在继承间接共同基类时只保留一份

注:虚基类并不是在声明基类时声明的而是在声明派生类时指定继承方式声明的

eg

class A{
……
};
class B:virtual public A
{
…
};
class C:virtual public A
{
…
};

声明基类的一般形式为

class 派生类名:virtual 继承方式 基类名

(经过多条派生路径被一个派生继承时,该派生类只继承该基类一次)

🐵注:

为了保证虚基类在派生类中只被继承一次,应当在该基类的所有直接派生类中声明为虚基类,否则会出现多次继承

2虚基类的初始化

如果在虚基类中定义了带参数的构造函数,没有定义默认构造函数,则在所有派生类中,通过构造函数初始化表对虚基类进行初始化

class A
{
A(int i){}//基类构造函数
…
};
class B:virtual public A
{
B(int n):A(n){}
…
};
class C:virtual public A{
C(int n):A(n){}
…
};
class D: public C,public B
{
D(int n):A(n),B(n),C(n){}
…
};

🐵注:在派生类中不仅要对直接基类进行初始化,还要对虚基础类进行初始化(并没有被多次初始化)

11.7基类和派生类的转换

公有继承:保持了除构造函数和析构函数以外所有的基类成员,基类的公有成员和保护成员都可以在派生类型访问,在派生类外可以调用基类的公有函数以访问基类的私有数据成员

所有基类能实现的功能,公用派生类都可以实现

子类型: 公有派生类

赋值兼容: 不同数据类型之间的自动转换和赋值

基类和派生类也具有赋值兼容关系

(1)派生类的值可以直接赋值给基类对象,反过来不可以,同一基类的不同派生类也不可以互相赋值

(大材小用,舍弃派生的成员)

(2)派生类对象可以直接代替基类对象向基类对象的引用进行赋值或者初始化

A al;//基类对象

B BL ;派生类对象

A&r=al;

也可以用子类对象初始化r

A&r=BL;