標籤:順序 namespace 情況 color argc pre include null 抽象
四種情況:
1. 建立一個類指標時,調用其建構函式;刪除當前指標時,自動調用其解構函式。
2. 建立子類對象指標時,首先調用其父類的建構函式,然後調用子類的建構函式;刪除當前指標時先調用子類的解構函式,然後調用父類的解構函式。
3. 一個父類指標指向子類地址時,建立指標時先調用父類的建構函式,然後調用子類的建構函式;刪除當前指標時,只調用父類的解構函式。
4. 在第三種情況中,為了在刪除指標時,也調用子類的解構函式,則需要將父類的解構函式聲明為抽象的。
給出具體的代碼實踐結果:
1 #include <iostream> 2 using namespace std; 3 4 //四種情況: 5 //1. 建立一個類指標時,調用其建構函式;刪除當前指標時,自動調用其解構函式 6 //2. 建立子類對象指標時,首先調用其父類的建構函式,然後調用子類的建構函式;刪除當前 7 // 指標時,先調用子類的解構函式,然後調用父類的解構函式 8 //3. 一個父類指標指向子類地址時,建立指標時先調用父類的建構函式,然後調用子類的建構函式; 9 // 刪除當前指標時,只調用父類的解構函式10 //4. 在第三種情況中,為了在刪除指標時,也調用子類的解構函式,則需要將父類的解構函式聲明為11 // 抽象的12 13 #define SAFE_DELETE(p) {delete (p);(p) = NULL;}14 15 class Person16 {17 public:18 Person(){19 cout<<"Person 建構函式"<<endl;20 }21 virtual ~Person(){22 cout<<"Person 解構函式"<<endl;23 }24 25 };26 27 class Son : public Person28 {29 public:30 Son(){31 cout<<"Son 建構函式"<<endl;32 }33 ~Son(){34 cout<<"Son 解構函式"<<endl;35 }36 37 };38 39 int main(int argc, char const *argv[])40 {41 Person *mPerson = new Person();42 SAFE_DELETE(mPerson);43 44 45 cout<<endl<<endl;46 47 Son *mSon = new Son();48 SAFE_DELETE(mSon);49 50 cout<<endl<<endl;51 52 Person *mPerson2 = new Son();53 SAFE_DELETE(mPerson2);54 55 56 return 0;57 }
結果:
Person 建構函式Person 解構函式Person 建構函式Son 建構函式Son 解構函式Person 解構函式Person 建構函式Son 建構函式Son 解構函式Person 解構函式
C++建構函式和解構函式執行順序