如果它们不包含静态数据,我是否需要为派生类实现自己的析构函数?

时间:2014-12-01 00:37:52

标签: c++ polymorphism destructor virtual-destructor

让我说我有:

class Base {
public:
    virtual ~Base() = 0;
}

class Derived: public Base {
public:
    ~Derived();
}

在我的代码中,我需要通过Derived指针删除Base类,如下所示:

delete[] pt_base;

但是,在实现的析构函数中,我实际上没有任何东西可以破坏。但我仍然需要它们通过基类删除?

在没有大量浪费的代码和空的析构函数的情况下,实现我想要的最佳方法是什么?

2 个答案:

答案 0 :(得分:5)

不,Base类的虚析构函数声明/定义就足够了,虽然将它抽象化需要你在Derived类中提供这个析构函数。

如果你刚宣布

class Base {
public:
    virtual ~Base() {} // <<< Have a definition
};

您不需要在继承的类中指定任何析构函数。

答案 1 :(得分:1)

如果你想为析构函数提供一个&#34;默认&#34;实现,然后提供default关键字用于此目的。它导致用户声明的析构函数与隐式定义的析构函数具有相同的行为。

class Derived : public Base {
public:
    ~Derived() = default;
}

这相当于提供像{}这样的空析构函数体,但可以更好地显示您的意图。

但是,不,你不需要来提供这些析构函数:

  

[C++11: 12.4/4]: 如果一个类没有用户声明的析构函数,则析构函数被隐式声明为默认值(8.4)。隐式声明的析构函数是inline public成员它的班级。

     

[C++11: 12.4/5]:如果出现以下情况,则将X类的默认析构函数定义为已删除:

     
      
  • X是一个类似联合的类,它有一个带有非平凡析构函数的变体成员,
  •   
  • 任何非静态数据成员都具有类类型M(或其数组),并且M具有已删除的析构函数或无法从默认析构函数中访问的析构函数,
  •   
  • 任何直接或虚拟基类都有一个已删除的析构函数或一个无法从默认析构函数中获取的析构函数,
  •   
  • 或者,对于虚拟析构函数,查找非数组释放函数会导致模糊或在默认析构函数中删除或无法访问的函数。
  •   
     

[..]

这些规则都不适用于此,并且在基类具有纯粹或不纯的虚析构函数的情况下,不存在更改此行为的规则,因此上面示例中隐式声明的析构函数不会被删除(即有效)

以下措辞是另一个强有力的线索,可以为您声明派生的析构函数:

  

[C++11: 12.4/9]:析构函数可以声明为virtual(10.3)或纯virtual(10.4);如果在程序中创建了该类或任何派生类的任何对象,则应定义析构函数。 如果一个类有一个带有虚析构函数的基类,那么它的析构函数(无论是用户还是隐式声明)都是virtual


不幸的是,如果你想要析构函数是纯粹的,你就不能使用default作为Base类;您还必须单独提供其[空]定义:

class Base {
public:
    virtual ~Base() = 0;
};

Base::~Base() {}