先說結論:
構造:
- 基類成員對象的構造函數
- 基類的構造函數
- 子類成員對象的構造函數
- 子類的構造函數
析構:
- 子類的析構函數
- 子類成員的析構函數
- 基類的析構函數
- 基類成員的析構函數
借一幅圖(https://blog.csdn.net/wq_1996/article/details/78219479)
可見是剛好反過來的。
// 驗證構造函數順序

#include<iostream> class Mem{ public: Mem(int x) { std::cout << "mem constructor " << x << std::endl; } }; class Base{ public: Base() { std::cout << "base constructor" << std::endl; } Mem* m = new Mem(1); }; class Test : Base{ private: int x; public: Test() { std::cout << "test constructor" << std::endl; } Mem* m = new Mem(2); }; int main() { Test* t = new Test(); }
// 驗證析構函數順序

#include<iostream> class Mem{ public: ~Mem() { std::cout << "mem" << std::endl; }; }; class Base{ public: ~Base() { std::cout << "~base" << std::endl; }; Mem m; }; class Test:Base{ public: ~Test() { std::cout << "~test" << std::endl; }; Mem m; }; int main() { Test t; t.~Test(); getchar(); return 0; }