首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++:默认构造函数实现

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

Stack Overflow用户
提问于 2018-05-09 08:26:19
回答 3查看 101关注 0票数 0

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

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

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

所以我有这样的东西:

代码语言:javascript
复制
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() {}
};

或者,在导出的内容中,我可以简单地做:

代码语言:javascript
复制
Derived() = default;
~Derived() = default;

或者甚至把它完全抛在脑后?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-05-09 08:49:23

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

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

  • 首先,并且仅针对最派生类(4.5)的构造函数,虚拟基类按照它们在基类有向无圈图的深度(首先左到右遍历)上出现的顺序进行初始化,其中“左到右”是派生类基类说明符-列表中基类的出现顺序。
  • 然后,直接基类按照的声明顺序初始化,就像它们出现在基类说明符列表中一样(不管mem-initializer的顺序如何)。
  • 然后,按照类定义中声明的顺序初始化非静态数据成员(同样不考虑mem初始化器的顺序)。
  • 最后,执行构造函数体的复合语句。

默认的构造函数只有一个空体,但是对象的构造意味着它的基类的构造。

票数 1
EN

Stack Overflow用户

发布于 2018-05-09 08:37:16

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

票数 1
EN

Stack Overflow用户

发布于 2018-05-09 08:40:42

默认生成的构造函数将是public,因此下面就足够了

代码语言:javascript
复制
class Derived: public IVCounter<SomeType>
{
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50248755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档