纯抽象基类上的虚拟析构函数

pm1*_*100 10 c++ virtual-destructor

我有

struct IMyInterface
{
   virtual method1() = 0;
   virtual method2() = 0;
};
Run Code Online (Sandbox Code Playgroud)

海湾合作委员会坚持认为我有

struct IMyInterface
{
   virtual method1() = 0;
   virtual method2() = 0;
   virtual ~IMyInterface(){};
};
Run Code Online (Sandbox Code Playgroud)

我不明白为什么.纯接口就是接口(duh).析构函数是接口的具体实现者的内部实现细节的一部分; 它不构成界面的一部分.我理解整个切片问题(或者至少我认为我这样做)

所以我的问题是 - GCC是否有权坚持它,如果是这样,为什么呢?

Lou*_*nco 22

根据C++规范,是的.

您需要声明析构函数是虚拟的,否则,稍后

    IMyInterface * ptr = getARealOne();
    delete ptr;
Run Code Online (Sandbox Code Playgroud)

不会在派生类上调用析构函数(因为析构函数不在VTable中)

它必须是非纯的,因为基类析构函数总是由子类析构函数调用.

为了进一步解释,C++没有像Java或C#那样的接口概念.它只是一种只使用纯虚方法的约定,并将其视为一个接口.关于C++析构函数的其他规则使它需要是非纯的,这打破了与其他语言中的接口的相似性,但这些规则制定时这些语言并不存在.

  • Nitpick - 如果您想要子类来实现它,我认为您可以将其设为纯虚拟.但是你仍然必须根据你说的理由提供一个实现. (4认同)