c++虛繼承可以防止多重繼承產生的二義性問題。
虛繼承,就是在被繼承的類前面加上virtual關鍵字,這時被繼承的類稱為虛基類,如下面**中的base類。虛繼承在多重繼承的時可以防止二義性。
class base
class derived1 : virutal public base
class derived2 : virtual public base
class derived3 : public derived1, public derived2
以上的**如果用到了base中的某個成員變數就不會產生二義性。和#progma once在標頭檔案中的作用類似。請看下面的例子:
#include
using namespace std;
class parent
}; class child1 : public parent
}; class child2 : public parent
}; class grandchild : public child1, public child2
}; int main(void)
上面程式是不能通過編譯的,編譯器輸出的錯誤資訊如下:
…: error c2385: 'grandchild::p' is ambiguous
…: warning c4385: could be the 'p' in base 'parent' of base 'child1' of class 'grandchild'
…: warning c4385: or the 'p' in base 'parent' of base 'child2' of class 'grandchild'
正如編譯器告訴我們的那 樣,grandchild::p是模稜兩可,它被child1繼承了即child1中包含了乙個parent subobject,也被child2繼承了即child2中也包含了乙個parent suboject,然後grandchild又同時繼承了child1和child2,根據「derived class中要保持base class的完整原樣性原則」,因此grandchild包含了兩個parentobject。所以當pgc->p時,編譯器根本無法確定是呼叫child1::p還是child2::p,由此邊產生了模稜兩可的情形。怎麼解決這樣的問題呢?答案就是用虛繼承或者叫虛基類的方式。
在上面的示例程式中做如下改動:
class child1 : public parent
->
class child1 : virtual public parent
class child2 : public parent
->
class child2 : virtual public parent
grandchild的定義維持不變:
class grandchild : public child1, public child2
做了上述改動後,即增加了兩個 virtual關鍵字,再編譯就不會出現ambiguous之類的錯誤了。這是因為加上了virtual關鍵字後,就可以保證parent suboject在grandchild中只存在乙份,從而消除了ambiguity。上面修改後的程式執行結果是13,這說明child2類的那個p起 了作用,如果grandchild的定義寫成:
class grandchild : public child2, public child1
那麼執行結果將是12。
上面的試驗結果表面,在多重繼承的時候,如果父類中有同名的成員變數(類似這篇文章中談及的例子),為了防止二義性,一般要採用虛繼承的方式,並且最右邊的基類中的那個成員變數會出現在派生類物件中。
C 中虛繼承的作用
2010 09 30 15 58 01 分類 c c 程式設計基礎 舉報 字型大小訂閱 我的 書 c 虛繼承可以防止多重繼承產生的二義性問題。虛繼承,就是在被繼承的類前面加上virtual關鍵字,這時被繼承的類稱為虛基類,如下面 中的base類。虛繼承在多重繼承的時可以防止二義性。class bas...
C 虛繼承的作用
c 虛繼承可以防止多重繼承產生的二義性問題。虛繼承,就是在被繼承的類前面加上virtual關鍵字,這時被繼承的類稱為虛基類,如下面 中的base類。虛繼承在多重繼承的時可以防止二義性。class base class derived1 virutal public base class derive...
C 虛繼承的作用
c 虛繼承可以防止多重繼承產生的二義性問題。虛繼承,就是在被繼承的類前面加上virtual關鍵字,這時被繼承的類稱為虛基類,如下面 中的base類。虛繼承在多重繼承的時可以防止二義性。class base class derived1 virutal public base class derive...