C++ 多重繼承(菱形繼承)

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()方法

}

參考原文:http://www.mallocfree.com/interview/cpp-1-c.htm

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容