在构造函数继承中使用默认构造函数

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 总是会有一个空的复合语句。所以人们不应该期望打印任何东西。

【讨论】:

以上是关于在构造函数继承中使用默认构造函数的主要内容,如果未能解决你的问题,请参考以下文章

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

继承&构造函数

使用虚拟继承时调用默认构造函数[重复]

为啥 C++ 构造函数在继承中需要默认参数?

C# 继承和默认构造函数

在继承的情况下编译器创建默认构造函数和用户创建默认构造函数之间的区别