C ++:默认构造函数实现

时间:2018-05-09 08:26:19

标签: c++

我有一个继承自基类的类,它提供了一个空的受保护构造函数。

我是否有必要在派生类中实现空构造函数(和析构函数),或者编译器是否会为我生成适当的构造函数。我正在使用C ++ 11。

虽然在这篇文章(How is "=default" different from "{}" for default constructor and destructor?)中回答了一些问题,但我最感兴趣的是派生类时的行为。

所以我有类似的东西:

template<typename EnumClass>
class IVCounter
{
protected:
    //!
    //! \brief Ensure that this base class is never instantiated
    //! directly.
    //!
    IVCounter() {}


public:
    //!
    //! \brief Virtual destructor
    //!
    virtual ~IVCounter() {}
};

class Derived: public IVCounter<SomeType>
{
   // Do I have to do this?
   Derived() 
   : IVCounter()
   {}

   ~Derived() {}
};

或许在派生中我可以简单地做:

Derived() = default;
~Derived() = default;

或者甚至可能完全放弃它?

2 个答案:

答案 0 :(得分:1)

是。编译器会生成空白构造函数,你不需要。

答案 1 :(得分:1)

这里不需要显式构造函数。隐式默认构造函数就足够了。 N4659草案在 15.6.2初始化基数和成员[class.base.init]§13:

  

在非委托构造函数中,初始化按以下顺序进行:

     
      
  • 首先,仅对最派生类(4.5)的构造函数初始化虚拟基类   它们出现在基类的有向无环图的深度优先从左到右遍历中的顺序,   其中“从左到右”是派生类base-specifier-list中基类出现的顺序。
  •   
  • 然后,直接基类按声明顺序初始化,因为它们出现在base-specifier-list中   (无论mem-initializers的顺序如何)。
  •   
  • 然后,按照在类定义中声明的顺序初始化非静态数据成员   (再次无论mem-initializers的顺序如何)。
  •   
  • 最后,执行构造函数体的复合语句。
  •   

隐含的默认构造函数只有一个空体,但构造对象意味着构造其基类