C/C++—— C++中定義虛解構函式的原因
C++中定義虛解構函式的原因
如果類中有虛擬函式,一般將該類的解構函式定義為虛擬函式。
在下面的例子中,沒有將解構函式定義為虛擬函式:
#include "iostream"
using namespace std;
class Parent
{
public:
Parent(int a = 0)
{
cout << "Parent()" << endl;
this->a = a;
}
//virtual ~Parent()
~Parent()
{
cout<<"~Parent()"<<endl;
}
private:
int a;
};
class Child : public Parent
{
public:
Child(int b = 0)
{
cout<<"Child()"<<endl;
this->b = b;
}
~Child()
{
cout<<"~Child()"<<endl;
}
private:
int b ;
};
//在父類中宣告虛解構函式的原因
//通過父類指標,把所有的子類解構函式都執行一遍。。。
void howtoDel(Parent *pbase)
{
delete pbase;
}
int main()
{
Child *pc1 = new Child();
howtoDel(pc1);
cout << "***********************" << endl;
Parent *pp1 = new Parent;
howtoDel(pp1);
return 0;
}
輸出:
Parent()
Child()
~Parent()
Parent()
~Parent()
可以看到執行howtoDel(pc1);析構子類物件的時候,僅僅呼叫了父類的解構函式,而沒有根據傳入的子類物件就呼叫子類的解構函式。
將解構函式定義為虛擬函式:
#include "iostream"
using namespace std;
class Parent
{
public:
Parent(int a = 0)
{
cout << "Parent()" << endl;
this->a = a;
}
virtual ~Parent()
{
cout<<"~Parent()"<<endl;
}
private:
int a;
};
class Child : public Parent
{
public:
Child(int b = 0)
{
cout<<"Child()"<<endl;
this->b = b;
}
~Child()
{
cout<<"~Child()"<<endl;
}
private:
int b ;
};
//在父類中宣告虛解構函式的原因
//通過父類指標,把所有的子類解構函式都執行一遍。。。
void howtoDel(Parent *pbase)
{
delete pbase;
}
int main()
{
Child *pc1 = new Child();
howtoDel(pc1);
cout << "***********************" << endl;
Parent *pp1 = new Parent;
howtoDel(pp1);
return 0;
}
輸出:
Parent()
Child()
~Child()
~Parent()
Parent()
~Parent()
可以看到執行howtoDel(pc1);析構子類物件的時候,呼叫了父類的解構函式,也根據傳入的子類物件呼叫子類的解構函式。(還可以看到在子類物件中建構函式和解構函式執行的順序是相反的)
在父類中宣告虛解構函式的原因:通過父類指標,把所有的子類解構函式都執行一遍。這也是多型現象。
相關文章
- C/C++—— C++中建構函式不能是虛擬函式的原因分析C++函式
- C++的虛解構函式的作用C++函式
- [cpp]C++中的解構函式C++函式
- C++ 中的虛擬函式C++函式
- C++箴言:避免解構函式呼叫虛擬函式C++箴言函式
- C++解構函式C++函式
- C++ 虛解構函式簡單測試C++函式
- C++中虛擬函式的作用C++函式
- 條款14 基類的解構函式一定要定義為虛擬函式(From Effective C++) (轉)函式C++
- C++ 虛擬函式C++函式
- C++虛擬函式C++函式
- C++中的虛擬函式(virtual function)C++函式Function
- C++中的虛擬函式與虛擬函式表 (轉)C++函式
- 詳解C++中的多型和虛擬函式C++多型函式
- C/C++中函式指標的含義C++函式指標
- C++之類解構函式為什麼是虛擬函式C++函式
- C++入門教程(12):定義函式C++函式
- c++建構函式詳解C++函式
- c++ 虛解構函式[避免記憶體洩漏]C++函式記憶體
- c++虛擬函式表C++函式
- C++虛擬函式bugC++函式
- C++中抽象類、虛擬函式和純虛擬函式C++抽象函式
- C++定義函式指標,回撥C#C++函式指標C#
- C++ Daily 《3》----建構函式可否是虛擬函式C++AI函式
- 【C++】建構函式C++函式
- C++建構函式C++函式
- c++建構函式詳解薦C++函式
- C++ 建構函式和解構函式C++函式
- C/C++—— C++中函式重寫和函式過載C++函式
- C++建構函式解構函式的執行過程C++函式
- C++中建構函式,拷貝建構函式和賦值函式的詳解C++函式賦值
- C++中的strrev函式C++函式
- C++ 介面(純虛擬函式)C++函式
- C++ 虛擬函式表剖析C++函式
- C++ 虛擬函式表解析C++函式
- C/C++中的new/delete、構造/解構函式、dynamic_cast分析C++delete函式AST
- C++中strlen函式C++函式
- C++ 類建構函式和解構函式C++函式