1。虛析構函數:ios
層次的根開始,沿着繼承路徑逐個調用基類的構造函數函數
確析構動態對象 spa
派生類動態對象也能夠正確地用delete析構設計
可以使派生類對象在不一樣狀態下正確調用指針
析構函數code
1 #include <iostream> 2 using namespace std; 3 4 class A 5 { 6 public: 7 //virtual ~A() //定義析構函數爲虛析構函數時,使用基類真正引用派生類對象後,正確的調用了派生類的析構函數,釋放了全部資源 8 ~A() 9 { 10 cout << "A::~A() is called!\n"; 11 } 12 }; 13 class B:public A 14 { 15 public: 16 ~B() 17 { 18 cout << "B:~B() is called!\n"; 19 } 20 }; 21 void main() 22 { 23 //用基類指針創建派生類的動態對象 24 A *a = new B(); 25 //用派生類指針創建派生類的動態對象 26 B *b = new B(); 27 cout << "delete first object:\n"; 28 //析構有基類創建的派生類對象,沒有調用派生的析構函數 29 delete a; 30 cout << "delete secod object:\n"; 31 //析構有派生類創建的派生類對象,正確的調用了派生類的析構函數 32 delete b; 33 }
1 #include <iostream> 2 using namespace std; 3 4 class A 5 { 6 public: 7 //virtual ~A() //定義析構函數爲虛析構函數時,使用基類真正引用派生類對象後,正確的調用了派生類的析構函數,釋放了全部資源 8 ~A() 9 { 10 cout << "A::~A() is called!\n"; 11 } 12 }; 13 class B:public A 14 { 15 public: 16 ~B() 17 { 18 cout << "B:~B() is called!\n"; 19 } 20 }; 21 void main() 22 { 23 //用基類指針創建派生類的動態對象 24 A *a = new B(); 25 //用派生類指針創建派生類的動態對象 26 B *b = new B(); 27 cout << "delete first object:\n"; 28 //析構有基類創建的派生類對象,沒有調用派生的析構函數 29 delete a; 30 cout << "delete secod object:\n"; 31 //析構有派生類創建的派生類對象,正確的調用了派生類的析構函數 32 delete b; 33 }