2015-03-30 36 views
0

我一直在閱讀C++有效第三版斯科特邁爾斯,並在其中一章,他說,有虛函數的任何類幾乎應該有一個虛析構函數。現在,下面我的代碼,功能someFunc不需要虛擬派生類。不過,我決定把它放在那裏以顯示語義和更好的可讀性。因爲我把虛擬放在那裏,這是否意味着派生類中的析構函數必須是虛擬的?在這種情況下,我還需要爲派生類創建一個虛擬析構函數嗎?

#include <iostream> 
using namespace std; 

class base 
{ 

public: 
    base(){...} 
    virtual ~base(){...} 

    virtual someFunc() = 0; 

}; 

class derived1:public base 
{ 

public: 
    derived1(){...} 
    ~derived1(){...} //Does this need to be virtual? 

    virtual someFunc(/*Implement the function*/); //I made this virtual just to show meaning 

}; 

int main() 
{ 

    base* b; 
    b=new derived1; 
    delete b; //Will this cause a memory leak? 

} 
+2

析構函數已經虛。你可以添加一個'virtual'關鍵字來提高可讀性,但它不會改變代碼的語義。我正在尋找一個很好的副本。 – juanchopanza 2015-03-30 19:32:35

+0

N.B.虛擬函數和你編寫'virtual'關鍵字是有區別的。我想你在這裏有一個誤解。希望我的回答能澄清一點。 – 2015-03-30 19:35:19

+1

只要函數(析構函數)被標記爲虛擬,它就會在所有派生類中保持虛擬。重複的'虛擬'在C++ 11之前是一個很好的提示。現在你應該在覆蓋一個虛函數時使用覆蓋。 – 2015-03-30 19:45:39

回答

6

它已經是!

virtual關鍵字是隱式的爲你derived::someFunc,對你derived::~derived,因爲兩種功能鹼當量標記virtual

所以,你可能會寫上這兩個關鍵字virtual,沒有或只有一個。這並不重要:無論如何,它們都將實際上是虛擬的。

5

是的,你仍然需要一個虛擬析構函數來派生類。

但是,沒有,你不需要使用就可以了virtual,也不是在所有它聲明:
基類的版本是虛擬自動將衍生一個虛擬無需你做任何事情。

0

每當有就是當你刪除分配的內存,它會自動調用兒童類析構函數父析構函數之前,虛擬的,你不必把兒童的析構函數是虛擬的。

相關問題