2011-03-22 329 views
4

我在AB.h文件有一個構造函數析構函數'AB ::〜AB()':
AC.h:錯誤:只有構造函數帶有基礎初始化符析構函數在C++

如果我使用〜AB();它說,我有虛函數,但我沒有析構函數,我誤解了哪裏? 三江源

+0

感謝球員,現在我有我的教訓,虛擬〜析構函數(){} – Xitrum 2011-03-22 14:34:01

回答

6

您收到錯誤和無關的警告。

錯誤是因爲你使用了析構函數的初始值設定項,這是沒有意義的,也不是有效的語法。

你想:

~AB() { } // destructor 

警告是因爲你還沒有宣佈你的析構函數是虛擬的。Classes with virtual methods should have virtual destructors

virtual ~AB() { } 
9

使用初始化列表,如

AB : a_member(4),another_member(5) {} 

也只感(和允許)的構造 - 在析構函數,你不想初始化的事情。

除了這個明顯的語法錯誤之外,編譯器會發出警告,因爲AB有一個virtual方法,但是也沒有聲明它的析構函數virtual。這是推薦因爲以下的原因:

AB* ab = new SomethingDerivedFromAB(); 
delete ab; // calls only AB's dtor and not SomethingDeriveFromAB's unless AB declares its dtor virtual 
+1

呀,更改〜AB:我(0) {}到〜AB {} – AndyG 2011-03-22 14:15:30

+0

是的我知道我不必在析構函數中重新初始化,但是如果我刪除它,編譯器會說「虛函數但沒有析構函數」 – Xitrum 2011-03-22 14:16:05

+0

編輯來解釋'virtual '東西。 – 2011-03-22 14:17:16

1

您應該使用virtual ~AB { }protected: ~AB { }爲您析構函數。

成員初始化列表: var(whatever)用於構造對象,在析構函數中沒有意義。

關於虛擬性的警告是因爲一般情況下,如果你打算讓你的類多態使用,你希望它也可以多態刪除。或者使析構函數受到保護,以便不能從父指針中多態地銷燬對象。

1

析構函數應該是虛擬的,因爲您打算從這個類繼承(methodA是虛擬的)。但是,這只是一個警告。

錯誤在於析構函數沒有參數,顯然沒有初始值設定項。

virtual ~AB() {} 
1
class AB{ 
private: int i; 
public: 
AB:i(0){} 
virtual ~AB(){} 
virtual void methodA(unsigned int value) = 0 ; }; 
0

編譯器警告你,當你在你的類有一個虛擬方法,你的析構函數不是虛擬的。這可能會導致問題,因爲在程序中可能只有基本析構函數會被調用。

2

如果您有虛擬功能,這是一個指示該類是爲了被分類。

如果您沒有將析構函數聲明爲虛函數,那麼具有指向基類的指針的人可以調用析構函數,該函數不會調用子類的析構函數,因爲它不是虛析構函數。這種情況會使由子類管理的內存/項目處於不正常的狀態,因爲它們不會被正確清理。

要學習的經驗是始終使析構函數爲虛擬的,即使您已經提供了實現。

1

你缺少括號在析構函數初始化:吳

class AB 
{ 
private: 
    int i; 
public: 
    AB():i(0){} // <-- parentheses here 
    virtual ~AB() {} // <-- parentheses here 
    virtual void methodA(unsigned int value)=0; 
};