在构造函数/析构函数中调用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函数,否则导致派生类的析构函数无法被执行。

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