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