C++支持多重繼承。來(lái)看看下面一組繼承關(guān)系:
class A
{
public:
virtual void f();
…
}
class B: public A
{
public:
virtual void f();
…
}
class C: public A
{
public:
virtual void f();
}
//類D多重繼承自B,C
class D: public B, public C
{
public:
void g();
}
B,C繼承于A,而D又繼承于B,C。C++中稱這種繼承關(guān)系為菱形繼承。如圖1所示,此種繼承方法一個(gè)不足之處為,在D的對(duì)象中,保存了2份A類中的數(shù)據(jù)成員。


圖1 非虛基類繼承對(duì)象結(jié)構(gòu)布局
而如果用下面的繼承方式,B,C通過(guò)virtual方式繼承A,那么如圖2所示,D中就只有一份關(guān)于A的數(shù)據(jù)成員了。
class A
{
public:
virtual void f();
…
}
class B: virtual public A
{
public:
virtual void f();
…
}
class C: virtual public A
{
public:
virtual void f();
…
}
class D: public B, public C
{
public:
void g();
…
}


圖2虛基類繼承對(duì)象結(jié)構(gòu)布局
此外,菱形繼承還會(huì)帶來(lái)二義性。例如上面例子中,如果在D中定義函數(shù)D::g()時(shí)引用了f()函數(shù):
void D::g()
{
f();
}
將無(wú)法知道f()是輸入類B還是類C。為了避免二義性,需要顯示的指出f()的出處。
void D::g()
{
B::f();//調(diào)用類B的f()方法
}