【问题标题】:What is constructor inheritance?什么是构造函数继承?
【发布时间】:2012-04-16 06:38:17
【问题描述】:

在C++11中,继承构造函数是什么意思?如果它是我认为的那样(基类构造函数被引入派生类的范围),它对我的​​代码有什么影响?这样的功能有哪些应用?

【问题讨论】:

标签: c++ inheritance constructor c++11


【解决方案1】:

继承构造函数就是这个意思。派生类可以从其基类隐式继承构造函数。

语法如下:

struct B
{
    B(int); // normal constructor 1
    B(string); // normal constructor 2
};

struct D : B
{
    using B::B; // inherit constructors from B
};

所以现在 D 隐式定义了以下构造函数:

D::D(int); // inherited
D::D(string); // inherited

Ds 成员默认由这些继承的构造函数构造。

就好像构造函数定义如下:

D::D(int x) : B(x) {}
D::D(string s) : B(s) {}

该功能没有什么特别之处。它只是节省键入样板代码的简写。

以下是血淋淋的细节:

12.9 继承构造函数

1) 命名构造函数的 using 声明隐式声明 一组继承构造函数。继承的候选集 使用声明中命名的类 X 的构造函数包括 由实际构造函数和概念构造函数组成 默认参数转换如下:

  • X 的所有非模板构造函数,以及
  • 对于具有至少一个带默认参数的参数的 X 的每个非模板构造函数,一组构造函数 省略任何省略号参数规范的结果和 从末尾开始连续省略带有默认参数的参数 参数类型列表,以及
  • X 的所有构造函数模板,以及
  • 对于具有至少一个带默认参数的参数的 X 的每个构造函数模板,生成的构造函数模板集 从省略任何省略号参数规范和连续 从末尾省略带有默认参数的参数 参数类型列表

【讨论】:

  • @Als,我刚读到,但我仍然不明白继承构造函数将如何初始化派生类数据成员。
  • @badmaash:看我的例子。 Ds 成员是默认构造的。
  • @badmaash:用户声明取代隐式声明。显式定义的 D(int) 优先,B(int) 不被继承。
  • 问题:“复制构造函数”和“移动构造函数”是否继承?我的实验 (clang3.3) 建议不是,但我找不到文本来确认这一点。
  • 您能否扩展示例以包含默认参数?
猜你喜欢
  • 1970-01-01
  • 2020-02-28
  • 2013-08-27
  • 1970-01-01
  • 2013-06-01
相关资源
最近更新 更多