多繼承中的記憶體分析示例

2021-06-28 06:16:32 字數 1657 閱讀 4100

#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...