繁体   English   中英

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

[英]virtual desctructor on pure abstract base class

我有

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

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

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

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

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

根据C ++规范,是的。

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

    IMyInterface * ptr = getARealOne();
    delete ptr;

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

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

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

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

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.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM