大多數應用程式使用單個基類的公用繼承,但是在某些情況下,單繼承是不夠的,必須使用多繼承。c++允許為乙個派生類指定多個基類,這樣的繼承結構被稱做多重繼承.
舉個例子,交通工具類可以派生出汽車和船連個子類,但擁有汽車和船共同特性水陸兩用汽車就必須繼承來自汽車類與船類的共同屬性。如下圖示:
**實現:
//多重繼承
#include
using namespace std;
class vehicle
void setweight(int weight)
virtual void showme() = 0;//純虛函式
protected:
int weight;
private:
};class car :public vehicle//汽車
void showme()
protected:
int aird;
private:
};class boat :public vehicle//船
void showme()
protected:
float tonnage;
private:
};class amphibiancar :public car, public boat//水陸兩用汽車,多重繼承的體現
void showme()
};int main()
上面的**從表面看,看不出有明顯的語發錯誤,但是它是不能夠通過編譯的。錯誤如下:
這有是為什麼呢? 這是由於多重繼承帶來的繼承的模糊性帶來的問題。
先看如下的圖示:
在圖中深紅色標記出來的地方正是主要問題所在,水陸兩用汽車類繼承了來自car類與boat類的屬性與方法,car類與boat類同為amphibiancar類的基類,在記憶體分配上amphibiancar獲得了來自兩個類的setweight()成員函式,當我們呼叫a.setweight(3)的時候計算機不知道如何選擇分別屬於兩個基類的被重複擁有了的類成員函式setweight()。
以上面的**為例,我們要想讓amphibiancar類既獲得乙個vehicle的拷貝,而且又同時共享用car類與boat類的資料成員與成員函式就必須通過c++所提供的虛擬繼承技術來實現。
在car類和boat類繼承vehicle類時前面加上virtual關鍵字就可以實現虛擬繼承,使用虛擬繼承後,當系統碰到多重繼承的時候就會自動先加入乙個vehicle的拷貝,當再次請求乙個vehicle的拷貝的時候就會被忽略,保證繼承類成員函式的唯一性。
修改後的**:
//加virtual後的正確**
#include
using namespace std;
class vehicle
void setweight(int weight)
virtual void showme() = 0;
protected:
int weight;
};class car :virtual public vehicle//汽車,這裡是虛擬繼承
void showme()
protected:
int aird;
};class boat :virtual public vehicle//船,這裡是虛擬繼承
void showme()
protected:
float tonnage;
};class amphibiancar :public car, public boat//水陸兩用汽車,多重繼承的體現
void showme()
void showmembers()
};int main()
輸出:
雖然說虛擬繼承與虛函式有一定相似的地方,但務必要記住,他們之間是絕對沒有任何聯絡的!總結多繼承的一些要點和注意事項:
class zooanimal
;class bear : public zooanimal
;class endangered
;class panda : public bear, public endangered
;如果有print函式的兩個過載版本:
void print(const bear&);
void print(const endangered&);
這個呼叫將會出錯,編譯器將指出改掉用有二義性。
class zooanimal
class endangered;};
class panda : public bear, public endangered
;int main()
輸出結果
如果在zooanimal中定義了print 而bear中沒有定義,同樣會出現二義性。避免二義性的最好方法就是指定函式的作用域,同上示例比如:
bear::print(x);
C 之多重繼承
當子類繼承於多個父類時,有以下兩種情況存在,稱之為多重繼承 多重繼承 include stdafx.h include includeusing namespace std 父類中同名函式如何區分 class a void print class b 父類b void print class c p...
C 之多重繼承
c 中,所謂的多繼承是指乙個派生類可以有多個基類,這樣就可能帶來以下幾方面的問題 1 多個基類中存在相同名稱時 如果乙個派生類繼承的多個基類中包含有相同名稱的函式時,有可能會產生呼叫不明確,即發生歧義,比如如下 1 class borrowableitem2 67class electronicga...
python之多重繼承
因為繼承可以獲取父類的屬性以及函式,所以繼承在物件導向程式設計中是乙個重要的方式,但是,如果物件中的繼承關係過多,就會導致繼承層次太多,因此出現了多重繼承的概念,即繼承不再是一對一,而是可以乙個子類繼承多個父類的方式,方法就是在類後面的括號用逗號隔開每乙個繼承類 如下 class animal ob...