在构造函数继承中使用默认构造函数
Posted
技术标签:
【中文标题】在构造函数继承中使用默认构造函数【英文标题】:using default constructor in constructor inheritance 【发布时间】:2019-03-04 17:03:46 【问题描述】:我有一个模板类“Derived”,它执行构造函数继承:
template <class T>
class Derived : public T
using T::T;
Derived()
std::cout<<"in derived";
;
我的基类有一个需要参数的构造函数:
class Base
public:
Base(int a)
std::cout<<"in base";
;
当我创建 Derived 类型的对象时,似乎没有调用派生构造函数:
Derived<Base> derived(2);
在“基础”中打印;
为什么?有没有办法告诉它调用 Derived 构造函数?
【问题讨论】:
你为什么期望它被调用?这是一个无参数构造函数,您正在调用一个带参数的构造函数。另外,模板部分与问题有什么关系?如果不是模板,情况会不会一样? 【参考方案1】:由继承的构造函数初始化如下:
[class.inhctor.init](强调我的)
1 当调用类型 B 的构造函数来初始化不同类型 D 的对象时(即,当构造函数被继承时),初始化就像使用默认的默认构造函数来初始化D 对象和继承构造函数的每个基类子对象,除了 B 子对象是通过调用继承的构造函数来初始化的。完整的初始化被认为是单个函数调用;尤其是继承的构造函数参数的初始化是在D对象的任何部分初始化之前进行的。
关键是默认这个词。默认 c'tor 由编译器生成,例如可以默认复制 c'tor。因此它不使用派生类中定义的任何 c'tor。编译器生成的 c'tor 总是会有一个空的复合语句。所以人们不应该期望打印任何东西。
【讨论】:
以上是关于在构造函数继承中使用默认构造函数的主要内容,如果未能解决你的问题,请参考以下文章