程式是這樣:
class A{};
class B{};
class C:public A,public B{};
void main ()
{
C* c=new C;
B* b=static_cast<B*>(c);
delete b;
}
編譯時記憶體出錯,如果在繼承時將A和B的順序調換之后就能正常運行。還有,如果B是繼承A的,C是繼承B的,也能正常運行。為什么會這樣,求大神指點。
uj5u.com熱心網友回復:
多重繼承時第一個比較主要吧。uj5u.com熱心網友回復:
多重集成時幾個基類在記憶體中的位置是不一樣的,其中第一個放在最前面,地址與派生類相同,所以在delete的時候不會出錯uj5u.com熱心網友回復:
二樓,能詳細點嗎,不是很清楚uj5u.com熱心網友回復:
看一下這個鏈接,說得應該比較詳細http://blog.csdn.net/dongfengsun/article/details/1476362
uj5u.com熱心網友回復:
dataxdata, 謝謝分享!uj5u.com熱心網友回復:
C* c=new C;B* b=static_cast<B*>(c);//此時 b指向 不等于 c指向 。“可能”會有個偏移量,而這與編譯器相關。
delete b; //造成這句例外,而且,一般也不要這樣用,除非為虛析構。
多繼承很麻煩,我也搞不懂。
uj5u.com熱心網友回復:
B* b= new C ;
delete b;
uj5u.com熱心網友回復:
這是因為b指向c中B類的位置按a\b的方式指向不是c的首地址,所以釋放有問題。uj5u.com熱心網友回復:
delete 基類指標;這樣的操作來洗掉派生類物件的話,那么基類的解構式必須為虛函式。
否則即使運行的時候沒報錯,那也是錯誤的代碼。
class A{};
class B{public : virtual ~B(){}};
class C:public A,public B{};
int main ()
{
C* c=new C;
B* b=c;
delete b;
}
uj5u.com熱心網友回復:
繼承要看虛函式表,轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/154341.html
標籤:基礎類
上一篇:如何在installshield2010中呼叫不同的PDF幫助檔案?
下一篇:bcb 隱藏表單 不能關機問題
