標籤:
1 #include <iostream> 2 using namespace std; 3 class A 4 { 5 public: 6 A () 7 { 8 cout<<"A 構造 "<<endl; 9 } 10 virtual ~A() // 定義虛解構函式 導致原來析構順序發生變化11 {12 cout<<"A 析構 "<<endl;13 }14 15 };16 class B : public A17 {18 public:19 B ()20 {21 cout<<"B 構造 "<<endl;22 }23 ~B ()24 {25 cout<<"B 析構 "<<endl;26 }27 28 };29 class C : public B30 {31 public :32 ~C ()33 {34 cout<<"C 析構 "<<endl;35 }36 37 C ()38 {39 cout<<"C 構造 "<<endl;40 }41 };
42 int main(int argc, char *argv[])43 { 44 B *b=new C; //由C的建構函式來建立的對象指標b,這一步會說明析構的b的範圍最深到c45 delete b;46 return 0;47 }
輸出結果:
說明:上面的例子對析構A或者對析構B其中一個或者兩個採用虛函數,都會是析構順序從最深的子類,這個最深由建立對象時候確定,如果
1 #include <iostream> 2 using namespace std; 3 class A 4 { 5 public: 6 A () 7 { 8 cout<<"A 構造 "<<endl; 9 } 10 virtual ~A()11 {12 cout<<"A 析構 "<<endl;13 }14 15 };16 class B : public A17 {18 public:19 B ()20 {21 cout<<"B 構造 "<<endl;22 }23 ~B ()24 {25 cout<<"B 析構 "<<endl;26 }27 28 };29 class C : public B30 {31 public :32 ~C ()33 {34 cout<<"C 析構 "<<endl;35 }36 37 C ()38 {39 cout<<"C 構造 "<<endl;40 }41 };42 class D : public C43 {44 public :45 ~D ()46 {47 cout<<"D 析構 "<<endl;48 }49 50 D ()51 {52 cout<<"D 構造 "<<endl;53 }54 };55 int main(int argc, char *argv[])56 { 57 B *b=new C;58 delete b;59 return 0;60 }View Code
那麼輸出結果跟上面的一樣
c++建構函式解構函式調用順序