#include
class baseclass
;virtual ~baseclass() ;
virtual void fool(void) {};
void getvalue(void) ;
};class midclass1: public baseclass
;virtual ~midclass1();
int getvalue(void) {};
virtual void setvalue(void) ;
class midclass2: public baseclass
;virtual ~midclass2();
int getvalue(void) {};
virtual void setvalue(void) ;
};class derivedclass:public midclass1,public midclass2
;~derivedclass();
virtual void foo2(void) {};
};int main()
採用vc++6.0 進行編譯,執行報錯:
報錯原因如下:
compiling...
0001.cpp
f:\練習題0101\0001.cpp(66) : error c2385: 'derivedclass::baseclass' is ambiguous
f:\練習題0101\0001.cpp(66) : warning c4385: could be the 'baseclass' in base 'midclass1' of class 'derivedclass'
f:\練習題0101\0001.cpp(66) : warning c4385: or the 'baseclass' in base 'midclass2' of class 'derivedclass'
f:\練習題0101\0001.cpp(69) : error c2385: 'derivedclass::baseclass' is ambiguous
f:\練習題0101\0001.cpp(69) : warning c4385: could be the 'baseclass' in base 'midclass1' of class 'derivedclass'
f:\練習題0101\0001.cpp(69) : warning c4385: or the 'baseclass' in base 'midclass2' of class 'derivedclass'
執行 cl.exe 時出錯.
0001.obj - 1 error(s), 0 warning(s)
解決如下:
採用虛擬繼承方法:
改為class midclass1: virtual public baseclass
class midclass2:virtual public baseclass
程式執行成功。
如圖所示:
結果顯示:
1)baseclass 只建立了乙個例項,其資料成員的位址相同。
2)baseclass的例項放在 derived例項的記憶體空間中的最後部分。
3)沒有了二義性問題,setvalue()和getvalue()的值是一指的。
4)使用虛擬繼承使程式占用空間增大了。
Python多繼承原理與用法示例
python中使用多繼承,會涉及到查詢順序 mro 重複呼叫 鑽石繼承,也叫菱形繼承問題 等 mromro即method resolution order,用於判斷子類呼叫的屬性來自於哪個父類。在python2.3之前,mro是基於深度優先演算法的,自2.3開始使用c3演算法,定義類時需要繼承obj...
C 物件的記憶體布局 多繼承
多繼承中,乙個派生類可以有多個基類.多繼承是c 頗受爭議的乙個語法特性,它就像一把雙刃劍,在提供便利及強大功能的同時,也帶來了一些容易使人產生錯誤的不便.在此主要說明一下多繼承時物件的記憶體分布 1.與單繼承相同,首先建立基類的物件,但要遵循一定的順序,這個順序是由派生類宣告時決定.2.和單繼承也一...
Python中的多繼承
python和c 一樣,支援多繼承。概念雖然容易,但是困難的工作是如果子類呼叫乙個自身沒有定義的屬性,它是按照何種順序去到父類尋找呢,尤其是眾多父類中有多個都包含該同名屬性。class p1 object deffoo self print p1 foo class p2 object deffoo...