虛解構函式的作用
轉自:http://hi.csdn.net/doer_ljy
如果一個基類的解構函式被說明為虛解構函式,則它的派生類中的解構函式也是虛解構函式,不管它是否使用了關鍵字virtual進行說明。
說明虛解構函式的目的在於在使用delete運算子刪除一個物件時,能保解構函式被正確地執行。因為設定虛解構函式後,可以採用動態聯編方式選擇解構函式。
下面舉一個用虛解構函式的例子。
#include <iostream.h>
class A
{
public:
virtual ~A() { cout < < "A::~A() Called.\n "; }
};
class B : public A
{
public:
B(int i) { buf = new char[i]; }
virtual ~B()
{
delete [] buf;
cout < < "B::~B() Called.\n ";
}
private:
char * buf;
};
void fun(A *a)
{
delete a;
}
void main()
{
A *a = new B(15);
fun(a);
}
執行該程式輸出如下結果:
B::~B() Called.
A::~A() Called.
如果類A中的解構函式不用虛擬函式,則輸出結果如下:
A::~A() Called.
當說明基類的解構函式是虛擬函式時,呼叫fun(a)函式,執行下述語句:
delete a;
由於執行delete語句時自動呼叫解構函式,採用動態聯編,呼叫它基類的解構函式,所以輸出上述結果。
當不說明基類的解構函式為虛擬函式時,delete隱含著對解構函式的呼叫,故產生
A::~A() Called.
的結果。
class A
{
public:
virtual ~A() { cout << "A::~A() Called.\n "; }
};
class B : public A
{
public:
B(int i) { buf = new char[i]; }
~B()
{
delete [] buf;
cout <<"B::~B() Called.\n ";
}
private:
char * buf;
};
class C:public B
{
public:
C(int i):B(i){}//派生類向基類傳值
~C()
{
cout<<"C::~C() called\n";
}
};
只要基類宣告瞭虛解構函式,則它所有的派生類均不用再將解構函式宣告為虛的
思考下下面兩段程式碼的輸出:
程式碼1:
B *a = new C(7);
delete a;
程式碼2:
A *a = new C(7);
delete a;
兩段程式碼均輸出:
C::~C() called
B::~B() Called.
A::~A() Called.
相關文章
- C++的虛解構函式的作用C++函式
- 虛解構函式(√)、純虛解構函式(√)、虛建構函式(X)函式
- 建構函式的作用函式
- C++中虛擬函式的作用C++函式
- C++箴言:避免解構函式呼叫虛擬函式C++箴言函式
- [CareerCup] 13.6 Virtual Destructor 虛解構函式Struct函式
- 作用域安全的建構函式函式
- 拷貝建構函式的作用函式
- C++之類解構函式為什麼是虛擬函式C++函式
- C++ 虛解構函式簡單測試C++函式
- 建構函式與解構函式函式
- 關於建構函式與解構函式的分享函式
- 【虛擬函式】C++中虛擬函式的作用是什麼?它應該怎麼用呢?[轉]函式C++
- 虛擬函式,虛擬函式表函式
- 虛擬函式 純虛擬函式函式
- C/C++—— C++中定義虛解構函式的原因C++函式
- c++ 虛解構函式[避免記憶體洩漏]C++函式記憶體
- 預設建構函式、引數化建構函式、複製建構函式、解構函式函式
- C++建構函式和解構函式呼叫虛擬函式時使用靜態聯編C++函式
- 如何寫一個作用域安全的建構函式函式
- del解構函式函式
- 啟用函式的作用函式
- 回撥函式的作用函式
- js reverse()函式的作用JS函式
- 神奇的函式作用域函式
- PHP筆記:建構函式與解構函式PHP筆記函式
- C++ Daily 《3》----建構函式可否是虛擬函式C++AI函式
- 函式副作用函式
- C++建構函式解構函式的執行過程C++函式
- 關於類的建構函式不能為虛擬函式的幾點理由!函式
- C#中解構函式,Close函式,Dispose函式的區別C#函式
- C#中的解構函式C#函式
- C++中建構函式,拷貝建構函式和賦值函式的詳解C++函式賦值
- C++解構函式C++函式
- 13-解構函式函式
- 函式、引數、解構函式
- 建構函式詳解函式
- 第六篇:為多型基類宣告虛解構函式多型函式