我在AB.h文件有一個構造函數析構函數'AB ::〜AB()':
AC.h:錯誤:只有構造函數帶有基礎初始化符析構函數在C++
如果我使用〜AB();它說,我有虛函數,但我沒有析構函數,我誤解了哪裏? 三江源
我在AB.h文件有一個構造函數析構函數'AB ::〜AB()':
AC.h:錯誤:只有構造函數帶有基礎初始化符析構函數在C++
如果我使用〜AB();它說,我有虛函數,但我沒有析構函數,我誤解了哪裏? 三江源
您收到錯誤和無關的警告。
錯誤是因爲你使用了析構函數的初始值設定項,這是沒有意義的,也不是有效的語法。
你想:
~AB() { } // destructor
的警告是因爲你還沒有宣佈你的析構函數是虛擬的。Classes with virtual methods should have virtual destructors:
virtual ~AB() { }
使用初始化列表,如
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
您應該使用virtual ~AB { }
或protected: ~AB { }
爲您析構函數。
成員初始化列表: var(whatever)
用於構造對象,在析構函數中沒有意義。
關於虛擬性的警告是因爲一般情況下,如果你打算讓你的類多態使用,你希望它也可以多態刪除。或者使析構函數受到保護,以便不能從父指針中多態地銷燬對象。
析構函數應該是虛擬的,因爲您打算從這個類繼承(methodA是虛擬的)。但是,這只是一個警告。
錯誤在於析構函數沒有參數,顯然沒有初始值設定項。
virtual ~AB() {}
class AB{
private: int i;
public:
AB:i(0){}
virtual ~AB(){}
virtual void methodA(unsigned int value) = 0 ; };
編譯器警告你,當你在你的類有一個虛擬方法,你的析構函數不是虛擬的。這可能會導致問題,因爲在程序中可能只有基本析構函數會被調用。
關於虛析構函數,見Rule of Three。
如果您有虛擬功能,這是一個指示該類是爲了被分類。
如果您沒有將析構函數聲明爲虛函數,那麼具有指向基類的指針的人可以調用析構函數,該函數不會調用子類的析構函數,因爲它不是虛析構函數。這種情況會使由子類管理的內存/項目處於不正常的狀態,因爲它們不會被正確清理。
要學習的經驗是始終使析構函數爲虛擬的,即使您已經提供了實現。
你缺少括號和在析構函數初始化:吳
class AB
{
private:
int i;
public:
AB():i(0){} // <-- parentheses here
virtual ~AB() {} // <-- parentheses here
virtual void methodA(unsigned int value)=0;
};
感謝球員,現在我有我的教訓,虛擬〜析構函數(){} – Xitrum 2011-03-22 14:34:01