C++支持多重繼承。來看看下面一組繼承關系:
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++中稱這種繼承關系為菱形繼承。如圖1所示,此種繼承方法一個不足之處為,在D的對象中,保存了2份A類中的數據成員。
圖1 非虛基類繼承對象結構布局
而如果用下面的繼承方式,B,C通過virtual方式繼承A,那么如圖2所示,D中就只有一份關于A的數據成員了。
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虛基類繼承對象結構布局
此外,菱形繼承還會帶來二義性。例如上面例子中,如果在D中定義函數D::g()時引用了f()函數:
void D::g()
{
f();
}
將無法知道f()是輸入類B還是類C。為了避免二義性,需要顯示的指出f()的出處。
void D::g()
{
B::f();//調用類B的f()方法
}