多重继承中,一个基类可以在派生层次中出现多次,如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多分同名成员。C++提供虚基类的方法使得在继承间接共同基类时只保留一份成员。
1.通常,每个类至初始化自己的直接基类,在应用于虚基类的时候,这个初始化策略会失败。如果使用这个规则,则可能多次初始化虚基类。为了解决这个问题,从具有虚基类的类继承的类初始化进行特殊处理。在虚派生中,由最底层的派生类构造函数初始化虚基类。即使是最底层派生类的非直接虚基类,也在最底层的虚派生类中调用其构造函数。
2.无论虚基类出现在继承层次中的任何地方,总是在构造非虚基类之前构造虚基类。代码如下:
class A
{
public:
A()
{
cout<<"A constructor!"<<endl;
}
};
class B
{
public:
B()
{
cout<<"B constructor!"<<endl;
}
};
class C
{
public:
C()
{
cout<<"C constructor!"<<endl;
}
};
class D : public A, public B, virtual public C
{
public:
D()
{
cout<<"D constructor!"<<endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
D d;
return 0;
}
运行结果:
可以看出,即使是C类在派生列表的最后,类C也是首先构造,因为C为虚基类。但是如果虚基类还有一个基类而且该基类不是虚基类,则必须先构造基类,代码如下:
class A
{
public:
A()
{
cout<<"A constructor!"<<endl;
}
};
class B
{
public:
B()
{
cout<<"B constructor!"<<endl;
}
};
class C
{
public:
C()
{
cout<<"C constructor!"<<endl;
}
};
class E : public C
{
public:
E()
{
cout<<"E constructor!"<<endl;
}
};
class D : public A, public B, virtual public E
{
public:
D()
{
cout<<"D constructor!"<<endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
D d;
return 0;
}
运行结果:
虽然E是虚基类而C不是,但是还是先构造了C,因为C是E的基类,在构造一个类之前,必须先构造基类,即使是虚继承也不例外。
原文链接: https://www.cnblogs.com/lzmfywz/archive/2013/03/31/2991922.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/82689
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!