C++建構函式和解構函式呼叫虛擬函式時使用靜態聯編
轉載自:https://www.cnblogs.com/bonelee/p/5826196.html
#include <iostream>
using namespace std;
class A{
public:
A() {
show();
}
virtual void show(){
cout<<"in A"<<endl;
}
virtual ~A(){
show();
}
};
class B:public A{
public:
B() {
show();
}
void show(){
cout<<"in B"<<endl;
}
};
int main(){
A *a = new A;
delete a;
cout << "*****************" << endl;
A *b = new B;
delete b;
}
輸出結果:
in A
in A
*****************
in A
in B
in A
結論:建構函式和解構函式呼叫虛擬函式時都不使用動態聯編,如果在建構函式或解構函式中呼叫虛擬函式,則執行的是為建構函式或解構函式自身型別定義的版本。
原因分析:
(1)不要在建構函式中呼叫虛擬函式的原因:因為父類物件會在子類之前進行構造,此時子類部分的資料成員還未初始化, 因此呼叫子類的虛擬函式是不安全的,故而C++不會進行動態聯編。
(2)不要在解構函式中呼叫虛擬函式的原因:解構函式是用來銷燬一個物件的,在銷燬一個物件時,先呼叫子類的解構函式,然後再呼叫基類的解構函式。所以在呼叫基類的解構函式時,派生類物件的資料成員已經“銷燬”,這個時再呼叫子類的虛擬函式已經沒有意義了。
相關文章
- [C++]顯示呼叫建構函式和解構函式C++函式
- C++ 建構函式和解構函式C++函式
- C++ 類建構函式和解構函式C++函式
- C++箴言:避免解構函式呼叫虛擬函式C++箴言函式
- C/C++——建構函式、複製建構函式和解構函式的執行時刻C++函式
- C++入門記-建構函式和解構函式C++函式
- 類的建構函式和解構函式函式
- C++ Daily 《3》----建構函式可否是虛擬函式C++AI函式
- 虛解構函式(√)、純虛解構函式(√)、虛建構函式(X)函式
- 第八章:不要在構造和解構函式中使用虛擬函式函式
- C/C++—— C++中建構函式不能是虛擬函式的原因分析C++函式
- c# tcbs之建構函式呼叫建構函式示例C#函式
- 構造和解構函式呼叫順序函式
- 預設建構函式、引數化建構函式、複製建構函式、解構函式函式
- Objective-C學習筆記---建構函式和解構函式Object筆記函式
- 【C++】建構函式C++函式
- C++建構函式C++函式
- 建構函式與解構函式函式
- C++之類解構函式為什麼是虛擬函式C++函式
- C++中建構函式,拷貝建構函式和賦值函式的詳解C++函式賦值
- 虛擬函式,虛擬函式表函式
- 虛擬函式 純虛擬函式函式
- 原則25:把建構函式和非成員函式虛擬化函式
- 【C++】初始化列表建構函式VS普通建構函式C++函式
- C++語言之結構體、類、建構函式、拷貝建構函式C++結構體函式
- C++建構函式解構函式的執行過程C++函式
- C++靜態函式C++函式
- C++ 虛擬函式C++函式
- C++虛擬函式C++函式
- ## 建構函式函式
- 建構函式函式
- C++:建構函式的分類和呼叫C++函式
- C++中抽象類、虛擬函式和純虛擬函式C++抽象函式
- C++中的虛擬函式與虛擬函式表 (轉)C++函式
- [譯] 建構函式已死,建構函式萬歲!函式
- 建構函式之間的呼叫函式
- C++再議建構函式及複製建構函式深度複製C++函式
- 限定建構函式必須使用new呼叫函式