若您继承了某个类别之後,当您在生成衍生类别的物件时若不指定参数,无参数的预设建构子会被执行,而基础类别的无参数预设建构子也会被执行,所以基於这种特性,通常预设建构子中会撰写一些通用的成员状态初始,例如设定一些预设值。
如果继承之後,您要使用衍生类别生成物件,在生成物件时指定参数,并同时执行基底类别中的某个参数建构子,您可以使用 : 运算子
例如:
// Point2D类别
class Point2D {
public:
Point2D() {
_x = 0;
_y = 0;
}
Point2D(int x, int y) : _x(x), _y(y) {
}
private:
int _x;
int _y;
};
class Point3D : public Point2D { // 继承Point2D类别
public:
Point3D() {
_z = 0;
}
// 建构函式,同时指定呼叫父类别建构函式
Point3D(int x, int y, int z) : Point2D(x, y), _z(z) {
}
private:
int _z; // 新增私用资料
};
如果您使用衍生类别生成物件,则建构函式的执行顺序会从基底类别的建构函式开始执行起,这是可以理解的,因为基底类别是衍生类别的基础,一些基础的参数或初始状态必须先完成,再来再完成衍生类别中的建构函式。
而在物件被消灭时,解构函式的执行顺序则正好相反,是从衍生类别的解构函式开始执行,再来才是基础类别的建构函式,因为若基底类别的解构函式如果先执行,则衍生类别相依於基底类别的一些状态也会被解构(例如指标),则此时再行衍生类别的解构函式,将存在着相依问题而造成错误。
下面这个简单的程式可以告诉您建构函式与解构函式,在继承之後的执行顺序:
#include <ioStream> using namespace std; class Foo1 { public:
Foo1() {
cout << "Foo1建构函式" << endl;
}
~Foo1()
{
cout << "Foo1解构函式" << endl;
}
};
class Foo2 : public Foo1 { public:
Foo2() {
cout << "Foo2建构函式" << endl;
}
~Foo2() {
cout << "Foo2解构函式" << endl;
}
};
int main()
{
Foo2 f;
cout << endl;
return 0;
}
执行结果:
Foo1建构函式
Foo2建构函式
Foo2解构函式
Foo1解构函式