拷贝构造函数不被继承

问题描述 投票:0回答:3

我有以下代码:

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
}   

派生类应该继承 base 的所有 ctors,除了默认的 ctor(在 here 中解释)。但是为什么copy ctor也不被继承呢?此处不接受相关问题的论点。

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

c++ c++11 inheritance copy-constructor
3个回答
21
投票

因为标准是这么说的。 [class.inhctor]/p3,强调我的:

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


13
投票

派生类应该继承基类的所有构造函数,除了默认构造函数

不,那不是真的,请参阅T.C. 的回答了解真正的规则。

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

拷贝构造函数比较特殊,它是用来拷贝一个相同类型的对象的。

构造函数

D(const C&)
不会用于复制相同类型的对象,因为
C
D
不同。


2
投票

暂时,我们假设允许“复制构造函数继承”。 让你的类结构完好无损,请考虑修改 main 方法的以下代码。

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属性。

但是在

D d_from_c(c)
的情况下,C的拷贝构造函数没有问题,因为,c的C属性可以被C的拷贝构造函数拷贝。但是编译器生成 D 的复制构造函数是如何知道如何从 C 的对象复制‘D 的属性’的。这是应该避免的冲突。

但是,如果您提供某种“奇怪的复制构造函数”(您可能还需要一个默认构造函数),例如;

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

然后, 打电话

D d_from_c(c);
已验证。因为,现在我们已经明确提供了一个匹配的“复制”构造函数。

所以,说“现在允许继承复制构造函数”是无效的。

© www.soinside.com 2019 - 2024. All rights reserved.