复制构造函数不被继承
Copy constructor is not inherited
我有以下代码:
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
}
Derived class 应该继承 base 的所有 ctors,除了默认的 ctor(已解释 here)。但是为什么copy ctor也不被继承呢?此处不接受相关问题的论点。
代码是用 g++ 4.8.1 编译的。
因为标准是这么说的。 [class.inhctor]/p3,强调我的:
For each non-template constructor in the candidate set of inherited
constructors other than a constructor having no parameters or a
copy/move constructor having a single parameter, a constructor is
implicitly declared with the same constructor characteristics unless
there is a user-declared constructor with the same signature in the
complete class where the using-declaration appears or the constructor
would be a default, copy, or move constructor for that class.
Derived class should inherit all ctors of base except the default ctor
不,这不是真的,请参阅 了解真正的规则。
继承构造函数的目的是说 "the derived type can be created from the same arguments as the base type",但这与基础 class 的复制构造函数无关,因为复制构造函数不仅仅是一种表达方式从给定参数创建类型。
拷贝构造函数比较特殊,是用来拷贝同类型对象的。
构造函数 D(const C&)
不会用于复制同一类型的对象,因为 C
与 D
.
的类型不同
暂时,我们假设允许“复制构造函数继承”。
在您的 class 结构完好无损的情况下,请考虑使用以下代码修改 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);
已验证。因为,现在我们已经明确提供了一个匹配的“复制”构造函数。
因此,说“现在允许继承复制构造函数”是无效的。
我有以下代码:
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
}
Derived class 应该继承 base 的所有 ctors,除了默认的 ctor(已解释 here)。但是为什么copy ctor也不被继承呢?此处不接受相关问题的论点。
代码是用 g++ 4.8.1 编译的。
因为标准是这么说的。 [class.inhctor]/p3,强调我的:
For each non-template constructor in the candidate set of inherited constructors other than a constructor having no parameters or a copy/move constructor having a single parameter, a constructor is implicitly declared with the same constructor characteristics unless there is a user-declared constructor with the same signature in the complete class where the using-declaration appears or the constructor would be a default, copy, or move constructor for that class.
Derived class should inherit all ctors of base except the default ctor
不,这不是真的,请参阅
继承构造函数的目的是说 "the derived type can be created from the same arguments as the base type",但这与基础 class 的复制构造函数无关,因为复制构造函数不仅仅是一种表达方式从给定参数创建类型。
拷贝构造函数比较特殊,是用来拷贝同类型对象的。
构造函数 D(const C&)
不会用于复制同一类型的对象,因为 C
与 D
.
暂时,我们假设允许“复制构造函数继承”。 在您的 class 结构完好无损的情况下,请考虑使用以下代码修改 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);
已验证。因为,现在我们已经明确提供了一个匹配的“复制”构造函数。
因此,说“现在允许继承复制构造函数”是无效的。