我有一个继承自基类的类,它提供了一个空的受保护构造函数。
我是否有必要在派生类中实现空构造函数(和析构函数),或者编译器是否会为我生成适当的构造函数。我正在使用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;
或者甚至可能完全放弃它?
答案 0 :(得分:1)
是。编译器会生成空白构造函数,你不需要。
答案 1 :(得分:1)
这里不需要显式构造函数。隐式默认构造函数就足够了。 N4659草案在 15.6.2初始化基数和成员[class.base.init]§13:
在非委托构造函数中,初始化按以下顺序进行:
- 首先,仅对最派生类(4.5)的构造函数初始化虚拟基类 它们出现在基类的有向无环图的深度优先从左到右遍历中的顺序, 其中“从左到右”是派生类base-specifier-list中基类出现的顺序。
- 然后,直接基类按声明顺序初始化,因为它们出现在base-specifier-list中 (无论mem-initializers的顺序如何)。
- 然后,按照在类定义中声明的顺序初始化非静态数据成员 (再次无论mem-initializers的顺序如何)。
- 最后,执行构造函数体的复合语句。
隐含的默认构造函数只有一个空体,但构造对象意味着构造其基类