菱形繼承函數
主要出如今多重繼承中。常常會出現的問題就是二義性。spa
//Animal類對應於圖表的類A class Animal { /* ... */ }; // 基類 { int weight; public: int getWeight() { return weight;}; }; class Tiger : public Animal { /* ... */ }; class Lion : public Animal { /* ... */ } class Liger : public Tiger, public Lion { /* ... */ };
上述代碼中,老虎類和獅子類繼承於動物這個基類,可是獅虎獸這個類同時繼承於老虎類和獅子類,那麼當出現下面的代碼就會出現編譯錯誤code
int main( ) { Liger lg ; /*編譯錯誤,下面的代碼不會被任何C++編譯器經過 */ int weight = lg.getWeight(); }
由於編譯器不知道該調用哪一個父類的getWeight()函數,Liger多重繼承了Tiger和Lion類,所以Liger類會有兩份Animal類的成員(數據和方法),Liger對象"lg"會包含Animal基類的兩個子對象。對象
因此,你會問Liger對象有兩個Animal基類的子對象會出現什麼問題?再看看上面的代碼-調用"lg.getWeight()"將會致使一個編譯錯誤。這是由於編譯器並不知道是調用Tiger類的getWeight()仍是調用Lion類的getWeight()。因此,調用getWeight方法是不明確的,所以不能經過編譯。blog
解決上述問題的方法一個是加限定符,另一個是用虛繼承的方式,若是Lion類和Tiger類在分別繼承Animal類時都用virtual來標註,對於每個Liger對象,C++會保證只有一個Animal類的子對象會被建立。繼承