在派生类构造函数中复制继承的成员是否有效?

时间:2014-10-24 06:04:58

标签: c++ inheritance

在下面的代码中,我在派生类中定义了一个显式的复制构造函数。我还在基类中编写了自己的复制构造函数。

Primer说派生的拷贝构造函数必须显式地调用基类,并且继承的成员只能由基类拷贝构造函数复制,但是我在派生类拷贝构造函数中复制了继承的成员,并且它工作正常。这怎么可能?

另外,如何在派生类复制构造函数中显式调用基类复制构造函数? Primer说基础(对象),但我很困惑语法如何区分正常构造函数调用和复制构造函数调用。

提前致谢。

#include<stdafx.h>
#include<iostream>

using namespace std;

class A
{
public:
  int a;
  A()
  {
    a = 7;
  }

  A(int m): a(m)
  {
  }
};

class B : public A
{
public:
  int b;
  B()
  {
    b = 9;
  }

  B(int m, int n): A(m), b(n)
  {
  }

  B(B& x)
  {
    a = x.a;
    b = x.b;
  }

  void show()
  {
    cout << a << "\t" << b << endl;
  }
};

int main()
{
  B x;
  x = B(50, 100);
  B y(x);
  y.show();
  return 0;
}

2 个答案:

答案 0 :(得分:1)

复制构造函数是指将另一个Object传递给构造函数时:

class A() {
    private:
        int a;
    public:
        //this is an empty constructor (or default constructor)
        A() : a(0) {};
        //this is a constructor with parameters
        A(const int& anotherInt) : a(anotherInt) {};
        //this is a copy constructor
        A(const A& anotherObj) : a(anotherObj.a) {}; 
}

用于派生类

class B : public A {
    private:
         int b;
    public:
         //this is the default constructor
         B() : A(), b() {};
         //equivalent to this one
         B() {};
         //this is a constructor with parameters
         // note that A is initialized through the class A.
         B(const int& pa, const int& pb) : A(pa), b(pb) {}
         //for the copy constructor
         B(const B& ob) : A(ob), b(ob.b) {}        
}

答案 1 :(得分:0)

其他人如何写在这里:

How to call base class copy constructor from a derived class copy constructor?

我会像这样编写复制构造函数,而不是像macmac编写的那样:

B(const B& x) : A(x) , b(x.b)
{
}

要调用基类A的复制构造函数,只需调用它传递派生的B对象A(B),就不需要指定B.a。

编辑:macmac以正确的方式编辑了他的答案,现在他的回答比我的好。