构造函数
前面说过,子类不仅有继承自父类的成员,还有自己声明的成员。父类的构造函数和析构函数只是关于父类成员的初始化和释放,所以要在子类中重新定义构造函数和析构函数。子类的构造函数格式为:
子类名(总参数列表):基类名(参数列表1),基类名2(参数列表2)
{
子类构造函数体
}
子类对象的建立过程为,编译器自动调用父类的构造函数、再调用子类的构造函数。如果子类中没有写构造函数,那么调用完父类的构造函数后,再调用自动生成的子类的构造函数。如果父类也没有构造函数,那么先后调用各自自动生成的构造函数。
析构函数与一般类的析构函数没有什么不同,对象的释放过程于构造函数正好相反。编译器自动调用子类的析构函数、再调用父类的析构函数。
#include <iostream>
using namespace std;
class Location
{
public:
Location(int a,int b){x=a;y=b;cout<<"Location Constructor"<<endl;}
void SetXY(int a,int b){x=a;y=b;}
~Location(){cout<<"Location Delete"<<endl;}
private:
int x,y;
};
class Rectangle: public Location
{
public:
Rectangle(int a,int b,int c,int d):Location(a,b){h=c;w=d;cout<<"Rectangle Constructor"<<endl;}
void SetHW(int a,int b){h=a;w=b;}
~Rectangle(){cout<<"Rectangle Delete"<<endl;}
private:
int h,w;
};
void main()
{
Rectangle r(1,2,3,4);
r.SetHW(1,1);
}
输出结果为:
Location Constructor
Rectangle Constructor
Rectangle Delete
Location Delete
从输出结果看看构造函数和析构函数的调用顺序。