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++】初始化列表建構函式VS普通建構函式C++函式
- 虛擬函式 純虛擬函式函式
- 虛擬函式,虛擬函式表函式
- C++靜態函式C++函式
- C++:建構函式的分類和呼叫C++函式
- ## 建構函式函式
- 建構函式之間的呼叫函式
- 【C++筆記】虛擬函式(從虛擬函式表來解析)C++筆記函式
- 【C++筆記】虛擬函式(從虛擬函式概念來解析)C++筆記函式
- 虛擬函式的呼叫原理函式
- PHP筆記:建構函式與解構函式PHP筆記函式
- C++複製建構函式C++函式
- 深入C++成員函式及虛擬函式表C++函式
- c++虛擬函式表C++函式
- PHP 手冊 (類與物件) 學習筆記五:建構函式和解構函式PHP物件筆記函式
- 介面、虛擬函式、純虛擬函式、抽象類函式抽象
- GC和解構函式(Finalize 方法)GC函式
- JavaScript 建構函式JavaScript函式
- 關於建構函式與解構函式的分享函式
- 迴圈單連結串列建構函式、解構函式C++實現函式C++
- 【譯】JavaScript 工廠函式 vs 建構函式JavaScript函式
- 建構函式與普通函式的區別函式
- 建構函式,拷貝賦值函式的N種呼叫情況函式賦值
- C++解構函式C++函式
- C++ 虛擬函式表解析C++函式
- C++ 介面(純虛擬函式)C++函式
- 內聯(inline)函式與虛擬函式(virtual)的討論inline函式
- 你不知道的JavaScript--Item8 函式,方法,建構函式呼叫JavaScript函式
- 建構函式和類函式
- 初識建構函式函式