2012-11-04 26 views
1

可能重複:
Pure virtual destructor in C++C++程序錯誤 - 虛擬析構函數

class A{ 
    public: 
     virtual ~A()=0; 
}; 

class B:public A{ 
     int *i; 
    public: 
     ~B() {delete i;} 
}; 

int main(){ 
    B* temp = new B; 
} 

我只是想有B時A的執行出於某種原因,我不能這樣做這個。

+2

B和S之間的關係是什麼? – billz

+0

哦對不起,忘了改變這一點。 – user1202422

+1

請注意,現在,您的'B ::〜B'具有未定義的行爲 - 它會刪除'i',但'i'從未初始化。 –

回答

3

在C++中的析構函數可以是純虛:

class A{ 
    public: 
     virtual ~A()=0; 
}; 

但在任何情況下,它需要被實現:

inline A::~A() {} 

否則A不是可用類。我的意思是破壞派生(S/B)是不可能的。並且需要破壞的可能性,在這條線:

B* temp = new B; 

因爲在扔異常的情況下 - 編譯器會自動自毀溫度...

+0

在頭文件中提供虛擬析構函數的內聯空實現。沒有其他辦法。否則,派生(S/B)的破壞是不可能的。 – PiotrNycz

+0

感謝添加該行固定我的程序。 – user1202422

+0

我不認爲帶'B'的行實際上可以調用任何析構函數,因爲如果'new'在完成'B'構造之前拋出它(實際上在啓動它之前;它無法獲得原始內存) ,所以析構函數'B ::〜B'不會被調用。但是這個(調用'B'構造函數的行)和編譯器一樣可以發現警告你不可能破壞'B';要麼你會最終做到這一點,或者你有內存泄漏。 –

1

根據您的評論"Yeah i want A to basically be just a container class. Do not want any implementation of A"。 您的B類應繼承protected/private而不是public繼承。 virtual ~A()允許爲pure,但您仍然需要向~A()提供實施。

class A{ 
public: 
    virtual ~A() = 0 
    { 
    cout << "~A"<<endl; 
    } 
}; 

class B : private /*protected*/ A{ 
    int *i; 
public: 
    B() : A(){ 
    i = new int; 
    } 
    ~B() { 
    delete i; 
    } 
}; 

int main(){ 
    B* temp = new B; 
    delete temp; 
    return 0; 
}