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

时间:2019-03-04 17:03:46

标签: c++ templates inheritance

我有一个模板类“ 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<Base> derived(2);

“在基础上”打印;

为什么?有没有办法告诉它调用派生构造函数?

1 个答案:

答案 0 :(得分:2)

由继承的构造函数初始化的过程如下:

  

[class.inhctor.init] (强调我的意思)

     

1调用类型B的构造函数初始化不同类型D的对象时(即,继承该构造函数时),初始化将进行,就像使用默认的默认构造函数来初始化初始化D对象和从其继承构造函数的每个基类子对象,除了B子对象是通过调用继承的构造函数来初始化的。完整的初始化被认为是单个函数调用。特别是,在初始化D对象的任何部分之前,先对继承的构造函数的参数进行初始化。

关键点是默认字。默认的c'tor由编译器生成,例如,副本c'tor可以默认。因此,它不使用派生类中定义的任何c'tor。编译器生成的c'tor总是会有一个空的复合语句。因此,不应期望会打印任何内容。