复制构造是不能继承

问题描述:

我有下面的代码:复制构造是不能继承

class C { 
public: 
    C(int) {} 
    C(const C&) {} 
    C() {} 
}; 

class D : public C { 
public: 
    using C::C; 
}; 

int main() { 
    C c; 
    D d_from_c(c); // does not compile, copy ctor is not inherited 
    D d_from_int(1); // compiles, C(int) is inherited 
} 

派生类要继承基础的所有构建函数,除了默认的构造函数(它被解释here)。但为什么copy ctor还没有被继承?来自相关问题的争论在这里是不能接受的。

该代码是用g ++ 4.8.1编译的。

因为标准是这样说的。 [class.inhctor]/P3,重点煤矿:

对于在候选集合中继承 构造比没有参数或具有单个参数 复制/移动的构造构造其他的每个非模板构造,构造函数是 隐含声明具有相同的构造函数特性除非 有一个用户声明的构造函数具有 完整类中的相同签名,其中使用声明出现或构造函数 将是默认,复制或移动该类的构造函数。

派生类要继承基础的所有构建函数,除了默认的构造函数

不,这不是真的,看到T.C.'s answer为真正的规则。

继承构造函数的目的是说“派生类型可以使用与基类型相同的参数来创建”,但这与基类的复制构造函数无关,因为复制构造函数不仅仅是一种说法,如何从给定的参数创建一个类型。

复制构造函数是特殊的,它用于复制相同类型的对象。

构造函数D(const C&)不会用于复制相同类型的对象,因为CD不是同一类型。

有一段时间,我们假定允许“复制构造函数继承”。 让您的课堂结构保持不变,请考虑下面的代码修改主要方法。

int main() { 
    C c; 
    D d; 
    D d_from_d(d); 
    D d_from_c(c); // does not compile, copy ctor is not inherited 
    D d_from_int(1); // compiles, C(int) is inherited 
} 

D d_from_d(d),作为一个正常的构造函数调用,将有两个拷贝构造函数调用。一个用于C :: C(const C &),另一个用于D的编译器生成拷贝构造函数。在D中有源对象类型(在这种情况下为d)时,C的拷贝构造函数可以在编译器生成D拷贝时复制C的属性构造函数可以复制D的属性。

但在D d_from_c(c)的情况下,C的拷贝构造函数没有问题,因为c的C属性可以被C的拷贝构造函数拷贝。但是编译器如何生成D的拷贝构造函数知道如何从C的对象中复制'D的属性'。这是一个应该避免的冲突。但是,如果你提供某种'奇怪的拷贝构造函数'(你也可能需要一个默认的构造函数),比如:

D(const C & c):C(c){} 

然后, 调用D d_from_c(c); 是有效的。因为,现在我们明确提供了一个匹配的“复制”构造函数。

因此,说'现在允许继承复制构造函数'是无效的。