虚基类:解决菱形继承导致的子对象重叠问题
考虑如图所示的菱形继承。
A和B继承了Base,分别重写show()方法。Child又继承了A和B。产生的问题及解决方案如下:
- Child调用show()时会产生二义性。(解决方案:重写/重载show()方法)
- Child继承的A和B中各自包含一份Base,菱形继承导致子对象重叠,增加了额外的空间开销。(解决方案:虚基类)
class virtualBasicClass
{
public:
virtual void show() const = 0;
};
class A : virtual public virtualBasicClass
{
public:
void show() const override{}
};
class B : virtual public virtualBasicClass
{
public:
void show() const override{}
};
class child : public A, public B
{
public:
void show() const override final
{
B::show();
}
};
Tpis:
override:检查当前函数是否是在重写父类的成员函数
final:禁止当前函数被派生类重写