我有一大组继承的类(条件),它继承自基类(标准)。这是criterion
的代码
class criterion
{
public:
virtual unsigned __int32 getPriorityClass() const = 0;
virtual BOOL include(fileData &file) const = 0;
virtual void reorderTree() = 0;
virtual unsigned int directoryCheck(const std::wstring& directory) const = 0;
virtual std::wstring debugTree() const = 0;
};
这个派生类的一些例子:
class fastFilter : public criterion
{
public:
void reorderTree() {};
unsigned int directoryCheck(const std::wstring& /*directory*/) const { return DIRECTORY_DONTCARE; };
unsigned __int32 getPriorityClass() const { return PRIORITY_FAST_FILTER; };
};
class isArchive : public fastFilter
{
public:
BOOL include(fileData &file) const
{
return file.getArchive();
}
std::wstring debugTree() const
{
return std::wstring(L"+ ISARCHIVE\n");
};
};
由于我根本没有析构函数,但是这应该是一个基类,我是否需要插入一个空的虚析构函数,即。像这样?:
virtual void ~criterion() = 0;
如果需要虚拟析构函数声明,那么所有中间类都需要一个吗?即fastFilter上面还需要一个虚拟析构函数吗?
答案 0 :(得分:39)
是 - 基类需要一个虚拟析构函数,即使它是空的。如果没有这样做,那么当delete
通过基指针/引用得到派生对象时,派生对象的成员对象将无法正确销毁自己。
派生类不需要声明或定义自己的析构函数,除非它们需要非默认析构函数行为。
答案 1 :(得分:24)
建议插入
virtual ~criterion() {}
避免删除基类指针问题。否则,您将泄漏内存,因为派生类的析构函数不会被调用。
criterion *c = new fastFilter();
delete c; // leaks
答案 2 :(得分:12)
你不需要将析构函数抽象化,只需给它一个空的实现:
virtual ~criterion() { }
这样你就不会被迫在每个子类中实现它,但它们中的每一个都会有一个(继承的)虚析构函数。
答案 3 :(得分:7)
与其他人已经回答的一个小变化:
而不是
virtual void ~criterion() = 0;
所需的版本是:
virtual ~criterion() {} //Note: Removed void as destructors not allowed
// a return type
要了解有关虚拟析构函数的更多信息,请查看常见问题解答When should my destructor be virtual?
中的此链接