什么是构造函数继承?

Posted

技术标签:

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

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

【问题讨论】:

本维基:Object construction Improvement 用简单明了的语言恰当地回答了您的问题。 【参考方案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) 建议不是,但我找不到文本来确认这一点。 您能否扩展示例以包含默认参数?

以上是关于什么是构造函数继承?的主要内容,如果未能解决你的问题,请参考以下文章

什么是继承?——构造函数原型实例

继承&构造函数

继承默认构造函数,矛盾吗?

java继承当中都有一些什么样的构造函数规则?

构造函数和析构函数能不能被继承

javascript之非构造函数的继承