C++继承後的建构函式与解构函式 |
若您继承了某个类别之後,当您在生成衍生类别的物件时若不指定参数,无参数的预设建构子会被执行,而 根底类别的无参数预设建构子也会被执行,所以基於这种 特点,通常预设建构子中会撰写一些通用的成员状态初始,例如设定一些预设值 。 假如继承之後,您要 使用衍生类别生成物件,在生成物件时指定参数,并同时执行基底类别中的某个参数建构子,您 可以 使用 : 运算子 例如: // Point2D类别 class Point2D { public: Point2D() { _x = 0; _y = 0; } Point2D(int x, int y) : _x(x), _y(y) { } private: int _x; int _y; }; // Point3D类别 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解构函式
|