我有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) 。代碼會很好地編譯,但執行後會崩潰。屬性是公共的,所以繼承的特性應該能夠爲我釋放一些記憶,對吧?
我有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) 。代碼會很好地編譯,但執行後會崩潰。屬性是公共的,所以繼承的特性應該能夠爲我釋放一些記憶,對吧?
我叫A的構造函數/析構函數以及B的,所以導致我如何編碼的效果,尤其是嚴重的內存泄露的幾個問題。感謝所有幫助人員,我只是因爲有人告訴我,構造函數被繼承而感到困惑。
有幾點意見:你會希望'class A'中的dtor是虛擬的(除非你知道你不知道,並且可以解釋爲什麼)。而且,構造函數沒有被繼承的事實意味着,例如,如果'A類'有一個帶int參數的構造函數,'A :: A(int x);',那麼'B類'不會*有這樣的構造函數,除非它也在'B'中明確聲明。 –
你應該可以,不管這是個好主意還是另一個問題。
你說你的代碼崩潰了,但是你沒有給出任何證據,因爲你正在B的析構函數中刪除A的mmeber變量。事實上,如果我不得不猜測,我會說現金的原因是缺乏A和B中的複製構造函數和賦值運算符(所謂的'三個規則',google它)。
如果你的程序崩潰了,那麼發佈崩潰的代碼可能是個好主意。我認爲這會提高你獲得有用答案的機會。
不要忘記他沒有的虛擬析構函數,他需要這個工作。 'A'的析構函數被聲明爲'virtual'。另外,他需要'A'作爲抽象類,所以它只能與派生類一起使用(這大概會破壞'A'創建的東西)。 –
根據您的實際代碼,它可能不會調用刪除o
,它可以是雙刪除x
,y
,z
。
您應該在基類(對於基類成員)和派生類(對於派生類成員)中正確實現銷燬。讓滴入式析構函數處理基類的銷燬。
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
何時析構函數是虛擬的?
- 當有人通過基類指針刪除派生類對象時。
難道你不應該在A類的析構函數中刪除它們,它會在B的dtor運行時自動調用它嗎? –
另外,你應該發佈ctors和dtors的實際代碼,這樣人們不必猜測你想要做什麼。 –
析構函數是繼承的嗎?但構造函數不是? – Saustin