菱形繼承

菱形繼承函數

主要出如今多重繼承中。常常會出現的問題就是二義性。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類的子對象會被建立。繼承

相關文章
相關標籤/搜索