C++建構函式和解構函式呼叫虛擬函式時使用靜態聯編

~,555555發表於2020-12-18

轉載自: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)不要在解構函式中呼叫虛擬函式的原因:解構函式是用來銷燬一個物件的,在銷燬一個物件時,先呼叫子類的解構函式,然後再呼叫基類的解構函式。所以在呼叫基類的解構函式時,派生類物件的資料成員已經“銷燬”,這個時再呼叫子類的虛擬函式已經沒有意義了。

相關文章