拷贝构造函数继承

Copy-constructor inheritance

本文关键字:继承 构造函数 拷贝      更新时间:2023-10-16
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 &X): m(50)。我是否需要为派生类做一个副本?像B(const B&x) ?我想既然B对象有a部分,我们可以使用B(const a &x): m(50)而不是默认构造函数::S

如果你有一个函数的参数是a对象,你可以发送一个B对象。它与复制构造函数有什么不同?

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

X的非模板构造函数是复制构造函数,如果它的第一个形参是X&const X&volatile X&const volatile X&类型,并且没有其他形参或其他所有形参都有默认实参(8.3.6)。

复制构造函数必须具有相同的类型。

实际上并没有创建复制构造函数。B(const A & x)只是一个构造函数,通过引用获取const A

因此,您不需要为派生类"as well"创建一个,而是"at all"。如您所述,此类型将为B(const B &x)

B类型类的默认复制因子为B(const B&)。因为你没有指定这个,编译器会为你生成它。

与用户定义的方法不同,这些方法不能由编译器生成。