我一直在閱讀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?
}
析構函數已經虛。你可以添加一個'virtual'關鍵字來提高可讀性,但它不會改變代碼的語義。我正在尋找一個很好的副本。 – juanchopanza 2015-03-30 19:32:35
N.B.虛擬函數和你編寫'virtual'關鍵字是有區別的。我想你在這裏有一個誤解。希望我的回答能澄清一點。 – 2015-03-30 19:35:19
只要函數(析構函數)被標記爲虛擬,它就會在所有派生類中保持虛擬。重複的'虛擬'在C++ 11之前是一個很好的提示。現在你應該在覆蓋一個虛函數時使用覆蓋。 – 2015-03-30 19:45:39