C++11 我应该在派生类中将析构函数显式声明为重写吗?
假设我们有下一个代码:C++11 我应该在派生类中将析构函数显式声明为重写吗?,c++11,overriding,C++11,Overriding,假设我们有下一个代码: class ISampleInterface { public: virtual ~ISampleInterface() {} ; virtual void Method1() = 0; virtual void Method2() = 0; }; class SampleClass : public ISampleInterface { public: SampleClass() { }; ~SampleClass() over
class ISampleInterface
{
public:
virtual ~ISampleInterface() {} ;
virtual void Method1() = 0;
virtual void Method2() = 0;
};
class SampleClass : public ISampleInterface
{
public:
SampleClass() { };
~SampleClass() override { };
void Method1() { };
void Method2() { };
};
int main()
{
ISampleInterface *pObject = (ISampleInterface*)new SampleClass();
delete pObject;
return 0;
}
是将~SampleClass()显式声明为重写还是不在乎
请注意,重点放在覆盖上,不要关心析构函数本身的实现。它是可以定义的,我只是在这里举个例子来说明我的问题。我不会这么做。我也不认为显式声明一个微不足道的析构函数有任何意义。让编译器完成它的工作。您可能需要在类中引入
virtual
析构函数,以(i)使类具有多态性(尽管任何函数都可以),以及(ii)协助内存管理,但这在这里并不严格相关
或者,如果你必须做这样的事情,考虑使用<代码> =默认符号,而不是显式地提供空体。
< P> IHO意见,任何答案都是偏颇的(即基于意见的)。通常,在许多优点中使用覆盖
说明符可以消除:
- 意外重写:通过声明与基类的虚拟成员函数意外具有相同名称和签名的成员函数来意外重写虚拟函数
- 签名不匹配:在派生类中定义一个函数,用于覆盖基类中的虚拟函数,但这两个函数具有不同的签名
覆盖
说明符在我看来有点冗长
我会尽力澄清我的立场。析构函数是一种特殊的成员函数。考虑到类层次结构,派生类的析构函数默认覆盖基类的析构函数(出于已知原因,应该声明为virtual
)。此外,您没有前面提到的优点(即,在析构函数的情况下,不会出现无意重写或签名不匹配)
因此,我不会指定析构函数
重写
看起来我至少找到了一个让析构函数重写更好的原因。
当接口基类的析构函数未声明为
virtual
时,析构函数的覆盖
可防止出错。谢谢您的意见,但实际上这并不是答案。