2011-07-13 79 views
0

我有2類:刪除繼承類型

class A 
{ 
public: 
char * x; 
char * y; 
char * z; 
A(); 
~A(); 
} 

class B: public A 
{ 
public: 
char * o; 
B(); 
~B(); 
} 

我想刪除[] X,Y和B類的析構函數Z(是的,A的構造不正確地分配的x,y和z) 。代碼會很好地編譯,但執行後會崩潰。屬性是公共的,所以繼承的特性應該能夠爲我釋放一些記憶,對吧?

+10

難道你不應該在A類的析構函數中刪除它們,它會在B的dtor運行時自動調用它嗎? –

+2

另外,你應該發佈ctors和dtors的實際代碼,這樣人們不必猜測你想要做什麼。 –

+0

析構函數是繼承的嗎?但構造函數不是? – Saustin

回答

0

我叫A的構造函數/析構函數以及B的,所以導致我如何編碼的效果,尤其是嚴重的內存泄露的幾個問題。感謝所有幫助人員,我只是因爲有人告訴我,構造函數被繼承而感到困惑。

+0

有幾點意見:你會希望'class A'中的dtor是虛擬的(除非你知道你不知道,並且可以解釋爲什麼)。而且,構造函數沒有被繼承的事實意味着,例如,如果'A類'有一個帶int參數的構造函數,'A :: A(int x);',那麼'B類'不會*有這樣的構造函數,除非它也在'B'中明確聲明。 –

0

你應該可以,不管這是個好主意還是另一個問題。

你說你的代碼崩潰了,但是你沒有給出任何證據,因爲你正在B的析構函數中刪除A的mmeber變量。事實上,如果我不得不猜測,我會說現金的原因是缺乏A和B中的複製構造函數和賦值運算符(所謂的'三個規則',google它)。

如果你的程序崩潰了,那麼發佈崩潰的代碼可能是個好主意。我認爲這會提高你獲得有用答案的機會。

+0

不要忘記他沒有的虛擬析構函數,他需要這個工作。 'A'的析構函數被聲明爲'virtual'。另外,他需要'A'作爲抽象類,所以它只能與派生類一起使用(這大概會破壞'A'創建的東西)。 –

1

根據您的實際代碼,它可能不會調用刪除o,它可以是雙刪除xyz

您應該在基類(對於基類成員)和派生類(對於派生類成員)中正確實現銷燬。讓滴入式析構函數處理基類的銷燬。

http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.12

當我寫派生類的析構函數,我需要顯式調用析構函數爲我的基類?

  • 沒有... 派生類的析構函數(不論你是否顯式地定義了)自動調用的基類子對象

而且在析構函數,這取決於你的代碼是如何使用的,您可能還需要使您的析構函數變爲虛擬。

http://www.parashift.com/c++-faq-lite/virtual-functions.html#faq-20.7

何時析構函數是虛擬的?

  • 當有人通過基類指針刪除派生類對象時。