多态中虚函数调用问题
在多态中,一般通过虚函数表会调用子类重写的虚函数,然而,有一种情况调用的还是父类的虚函数,就是在父类的构造函数中调用的是父类的虚函数,无论子类是否重写。
#include <iostream>
#include <list>
#include <vector>
using namespace std;
class Base
{
public:
Base()
{
cout << "Base()" << endl;
fun();
}
virtual void fun() { cout << "Base fun()" << endl; }
};
class Son:public Base
{
public:
Son()
{
cout << "Son()" << endl;
}
void fun() override{ cout << "Son fun()" << endl; }
};
int main() {
Base* p = new Son();
return 0;
}
原因是父类对象尚未创建完成,因此虚函数机制(即虚表的分派)并没有完全生效。虚函数的分派机制依赖于对象的完整类型,而在构造函数阶段,C++ 认为对象的类型是父类类型。