当存在类的继承关系时,对于一个类,如果程序员没有编写拷贝构造函数,编译系统会在必要时自动生成一个隐含的拷贝构造函数,这个隐含的拷贝构造函数会自动调用基类的拷贝构造函数,然后对派生类新增的成员对象一一执行拷贝。
如果要为派生类编写拷贝构造函数,一般需要为基类相应的拷贝构造函数传递参数。例如,假设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。