【问题标题】: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 构造函数?

【问题讨论】:

  • 你为什么期望它被调用?这是一个无参数构造函数,您正在调用一个带参数的构造函数。另外,模板部分与问题有什么关系?如果不是模板,情况会不会一样?

标签: c++ templates inheritance


【解决方案1】:

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

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

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

关键是默认这个词。默认 c'tor 由编译器生成,例如可以默认复制 c'tor。因此它不使用派生类中定义的任何 c'tor。编译器生成的 c'tor 总是会有一个空的复合语句。所以人们不应该期望打印任何东西。

【讨论】:

    猜你喜欢
    • 2016-03-24
    • 1970-01-01
    • 2017-10-04
    • 2015-07-09
    • 2011-05-20
    • 1970-01-01
    • 2018-04-18
    • 2016-12-05
    • 2021-06-02
    相关资源
    最近更新 更多