虚函数在构造函数与析构函数中失效

虚函数在构造函数与析构函数中失效
这只是一个很小的细节问题,更详细的内容可以搜索《ATL布幔之下的秘密》。
手头上的一个基类,有一个protected virtual 函数_init(),该函数在基类的构造函数中被调用。我的意图是子类如果有自己特殊的变量要初始化的话,只要重写该虚函数就可以了。例如:
void   Derive::_init()
{
Base::_init()
// other work
}
希望像template method模式一样工作。
问题是我忘记了这个细节,结果程序陷入不确定的状态。

随后做了些简单的验证,查看编译出来的汇编代码。
结论是:继承体系中构造函数的顺序,是先基类后子类,同时在构造函数中,先设置vftable指针,然后才执行用户代码,因此基类中调用虚函数,只能是基类的函数而已,汇编代码大概是这样子:
; D::D()
call  Base::Base()
mov vftable 
=   0x11111
endp

;Base::Base()
mov vftable 
=   0x22222
call _init
endp
析构函数的顺序,是先子类后基类,同构造函数一样,也是先设置vftable指针,然后才执行用户代码,所以虚函数一样失去作用。

你可能感兴趣的:(虚函数在构造函数与析构函数中失效)