当存在类的继承关系时,对于一个类,如果程序员没有编写拷贝构造函数,编译系统会在必要时自动生成一个隐含的拷贝构造函数,这个隐含的拷贝构造函数会自动调用基类的拷贝构造函数,然后对派生类新增的成员对象一一执行拷贝。
如果要为派生类编写拷贝构造函数,一般需要为基类相应的拷贝构造函数传递参数。例如,假设D类是B类的派生类,D类的拷贝构造函数形式如下:
D::D(const Derived &v):B(v){...}
【例】
class B
{
public:B(int x = 0):x(x){cout << "基类B构造函数" << endl;}B(B& b){cout << "基类B的拷贝构造函数" << endl;x = b.x;}void show1(){cout <<"x的值为:"<< x << endl;}int getX(){return x;}
private:int x;
};class D :public B
{
public:D(int a, int b, int c, int d):B(a),y(b),z(c),v(d){cout << "派生类D的构造函数" << endl;}D(D& dd) :B(dd)//用派生类的对象dd去初始化基类的引用{cout << "派生类D的拷贝构造函数" << endl;x = dd.x;y = dd.y;z= dd.z;v = dd.v;}void show2(){cout << "x的值为:" << getX() << endl;cout << "y的值为:" << y << endl;cout << "z的值为:" << z << endl;cout << "v的值为:" << v << endl;}
private:int x;int y;int z;int v;
};int main()
{B b(5);b.show1();D d(1, 2, 3, 4);d.show2();D dd(d);dd.show2();return 0;
}
运行结果:
由于类型兼容规则的作用,可以用派生类的对象去初始化基类的引用,所以上面B类的拷贝构造函数的参数是D类对象的引用dd。