在構造函數/析構函數中調用virtual函數帶來的影響

在構造函數/析構函數中調用virtual函數,那麼調用的一定是本類中的virtual函數

先看一段代碼:

#include<iostream>

class Base {
public:
    Base() {
        print();
    }
    ~Base() {
        print();
    }

    virtual void print() {
        std::cout << "Base::print" << std::endl;
    }
};

class Drived : public Base {
public:
    Drived() {
        print();
    }
    ~Drived() {
        print();
    }

    virtual void print() {
        std::cout << "Drived::print" << std::endl;
    }
};

int main() {
    Base *b = new Drived();
    delete b;
    return 0;
}

執行結果如下:

從結果中可以看到:

(1)、Base基類中的構造函數中調用virtual函數,調用的是本類中的virtual函數

Base基類中的析構函數中調用virtual函數,調用的也是本類中的virtual函數

(2)、Drived派生類中的構造函數中調用virtual函數,調用的是本類中的virtual函數

Drived派生類中的析構函數中調用virtual函數,調用的也是本類中的virtual函數

 

根本原因:

虛指針是在構造函數中創建的,在析構函數中銷燬的。如果在構造函數/析構函數中調用virtual函數,那麼調用的一定是本類中的virtual函數。

 

此外:對於上的結果中沒有執行Drived派生類的析構函數,是因爲基類的析構函數不是virtual函數導致的。

因此,基類的析構函數一定要是virtual函數,否則導致派生類的析構函數無法被執行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章