C++,继承的copy ctors不起作用?

标签 c++ c++11

考虑以下代码:

class TBase {
public:
   TBase();
   TBase(const TBase &);
};

class TDerived: public TBase {
public:
   using TBase::TBase;
};

void f() {
   TBase Base;
   TDerived Derived(Base); // <=== ERROR
}

所以,我有基类和派生类,并且想使用“使用 TBase::TBase”从基类中提取复制构造函数,以便能够以这种方式创建派生类的实例:

   TDerived Derived(Base);

但是all compilers拒绝这些错误消息

7 : note: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'TBase' to 'const TDerived' for 1st argument

为什么?我究竟做错了什么?为什么“使用 TBase::TBase”在这种情况下不起作用?

更新 如何解释以下来自 cppreference.com 的一段代码?

struct B1 {
    B1(int);
};
struct D1 : B1 {
    using B1::B1;
// The set of inherited constructors is 
// 1. B1(const B1&)
// 2. B1(B1&&)
// 3. B1(int)

最佳答案

复制和移动构造函数(以及默认构造函数)永远不会被继承,只是因为标准是这么说的。所有其他构造函数都是。

关于 cppreference 的评论具有误导性(1)。标准中的相同评论说:

The candidate set of inherited constructors in D1 for B1 is

(强调我的)。

然后标准继续说只有 D1(int) 构造函数实际上是继承的。 D1 的复制和移动构造函数与任何其他类一样隐式声明,继承。

详情请引用C++14 12.9 [class.inhctor]。


(1) 我提交了对 cppreference 的更改,希望能澄清这一点。

关于C++,继承的copy ctors不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37585945/

相关文章:

gcc - 在 gcc 中启用 C++0x 支持的副作用

c++ - 初始化后来自 valarray<int> 的错误值

c++ - 如何使用 boost 处理经纬度值?

c++ - 字符串化 block 中的空字 rune 字

c++ - C++ 的可调整大小的字符缓冲区容器类型

c++ - C++中的多维数组初始化

c++ - 如何将秒转换为hh :mm:ss.毫秒格式c++?

c++ - 如何通过C++代码让主板发出蜂鸣声?

C++打印二维数组

c++ - 为什么 std::uninitialized_move 不存在?