我已經在C++中定義了一個接口,即僅包含純虛函數的類。GNU編譯器警告「類具有虛擬函數但非虛擬析構函數」
我想明確地禁止界面的用戶通過一個指向接口刪除的對象,所以我宣佈的接口保護和非虛析構函數,是這樣的:
class ITest{
public:
virtual void doSomething() = 0;
protected:
~ITest(){}
};
void someFunction(ITest * test){
test->doSomething(); // ok
// deleting object is not allowed
// delete test;
}
的GNU編譯器給我一個警告說:
類「ITEST」有虛函數,但非虛析構函數
一旦析構函數被保護,它在虛擬還是非虛擬方面有什麼區別?
您是否認爲這個警告可以安全地忽略或沉默?
我總是想知道爲什麼析構函數不總是虛擬的... – INS 2008-09-24 14:23:26
2個原因。 (1)您只需支付您在C++中使用的內容。如果虛擬機是虛擬的,那麼很多類都會有不需要的虛擬機。 (2)我認爲某些框架(如CORBA)現在依賴於當前的行爲。 – 2008-09-24 14:28:39
Richard和Airsource,我刪除了引用上一個答案的評論。我現在對你的答案沒有任何問題,並將我的初始-1改爲+1 ... – 2008-09-24 16:49:38