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