struct A{
virtual void what() { cout << "Base" << endl; };
};
struct B : A {
virtual void what() { cout << "Sub" << endl; };
int m;
B() : m(10) {};
B(const A & x) : m(50) {};
};
void main() {
B b1;
B b2 = b1;
cout << "Number: "
<< b2.m << endl;
};
为什么不是b2.m = 50?我正在尝试复制一个b对象,我有复制构造函数B(const A&amp; x):m(50)。我是否需要为派生类屁股做一个复制c'tor?像B(const B&amp; x)??我认为既然一个b对象有一个部分,我们可以使用B(const A&amp; x):m(50)而不是默认构造函数:: S
如果您具有带A对象参数的函数,则可以发送B对象。为什么它与拷贝构造函数不同?
答案 0 :(得分:14)
原因是B(const A& x)
不是copy-ctor - 类型T
的复制构造函数必须始终将T
的左值引用作为第一个(并且没有其他非默认参数)参数。您的类没有定义的copy-ctor,因此编译器会生成默认的copy-ctor,它会执行成员方式的复制,因此b2.m
与b1.m
相同。
如果第一个参数的类型为
X
,X&
,const X&
或volatile X&
,则类const volatile X&
的非模板构造函数是一个复制构造函数,并且没有其他参数,或者所有其他参数都有默认参数(8.3.6)。
答案 1 :(得分:1)
复制构造函数必须属于同一类型。
您实际上没有制作过复制构造函数。 B(const A & x)
只是一个构造函数,它通过引用获取const A
。
因此,您不需要为派生类创建一个“也”,但“根本”。如您所述,其类型为B(const B &x)
。
答案 2 :(得分:1)
B类的默认copy-ctor将是B(const B&amp;)。由于您尚未指定此项,因此编译器会为您生成它。
它与用户定义的方法不同,因为它们无法编译生成。