复制构造函数继承

时间:2011-10-15 15:20:26

标签: c++ inheritance copy-constructor

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对象。为什么它与拷贝构造函数不同?

3 个答案:

答案 0 :(得分:14)

原因是B(const A& x)不是copy-ctor - 类型T的复制构造函数必须始终将T的左值引用作为第一个(并且没有其他非默认参数)参数。您的类没有定义的copy-ctor,因此编译器会生成默认的copy-ctor,它会执行成员方式的复制,因此b2.mb1.m相同。

  

如果第一个参数的类型为XX&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;)。由于您尚未指定此项,因此编译器会为您生成它。

它与用户定义的方法不同,因为它们无法编译生成。