最近看到这样一个crash
手动构造pure virtual method called:
class virtualBase {
public:
virtualBase(void (virtualBase::*func)()) {
(this->*func)();
}
virtual ~virtualBase() {}
virtual void print() = 0;
void get() {}
};
class virtualSub : public virtualBase {
public:
virtualSub() : virtualBase(&virtualBase::print){}
~ virtualSub() {}
virtual void print() override {
}
};
int main()
{
virtualBase *demo = nullptr;
demo = new virtualSub();
}
同样析构时调用虚函数:
也会出现相同情况
换个写法,虚函数表构建完成后就可以了。
也就是说子类的虚函数表完整的时候才不会有问题。
这也是避免在析构和构造函数中调用虚函数的一个原因。
虚函数表创建流程参考: