12

我有

struct IMyInterface
{
   virtual method1() = 0;
   virtual method2() = 0;
};

GCC 坚持说我有

struct IMyInterface
{
   virtual method1() = 0;
   virtual method2() = 0;
   virtual ~IMyInterface(){};
};

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

所以我的问题是 - 海湾合作委员会坚持这样做是否正确,如果是,为什么?

4

2 回答 2

25

根据 C++ 规范,是的。

您需要声明析构函数 virtual 否则,稍后

    IMyInterface * ptr = getARealOne();
    delete ptr;

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

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

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

于 2010-07-26T15:50:44.457 回答
3

如果你没有在基类中声明 virtual d'tor,通过指向基类的指针删除派生类的对象会导致调用错误的析构函数,从而导致未定义的行为和资源泄漏。

struct A {

  virtual ~A() {}

};

struct B : A {

   std::string us_constitution;  
};


B* pb = new B();
A* pa = pb;

delete pa; // without the virtual d'tor in the base class, 'B::us_constitution' would never be freed.
于 2010-07-26T15:51:39.820 回答