复制构造是不能继承
我有下面的代码:复制构造是不能继承
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&)
不会用于复制相同类型的对象,因为C
与D
不是同一类型。
有一段时间,我们假定允许“复制构造函数继承”。 让您的课堂结构保持不变,请考虑下面的代码修改主要方法。
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);
是有效的。因为,现在我们明确提供了一个匹配的“复制”构造函数。
因此,说'现在允许继承复制构造函数'是无效的。