假设我们有下一个代码:
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()为覆盖或不关心?
P.S。请专注于覆盖并且不关心析构函数本身的实现。它可以定义,我只是在这里举例说明我的问题。
答案 0 :(得分:1)
我不会这样做。我也没有看到明确声明一个简单的析构函数的任何意义。让编译器完成它的工作。您可能需要在类中引入virtual
析构函数,以便(i)使类具有多态性 - 尽管任何函数都可以执行此操作 - 以及(ii)协助内存管理,但这并不是严格相关的。< / p>
或者,如果必须做这样的事情,请考虑使用= default
表示法,而不是明确提供空体。
答案 1 :(得分:0)
恕我直言,任何答案都会有偏见(即基于意见)。通常,在许多优点中使用override
说明符具有消除:
无意覆盖:通过声明一个意外与基类的虚拟成员函数具有相同名称和签名的成员函数,无意中覆盖了虚函数。
签名不匹配:在派生类中定义一个函数,该函数旨在覆盖基类中的虚函数,但这两个函数具有不同的签名。
现在,在析构函数的特定情况下,附加override
说明符在我看来有点冗长。
我会试着清除我的立场。析构函数是一个特殊的成员函数。考虑类层次结构,派生类的析构函数默认覆盖基类的析构函数(出于已知原因应该声明为virtual
)。此外,您不具备前面提到的优势(即,在析构函数的情况下,无论是无意的覆盖还是签名不匹配)。
因此,我不会指定析构函数override
。
答案 2 :(得分:0)
看起来我发现至少有一个原因可以让析构函数覆盖更好。
析构函数的override
防止在接口基类的析构函数未声明为virtual
时出错。