随笔 - 119  文章 - 290  trackbacks - 0

博客搬家了哦,请移步
叫我abc

常用链接

留言簿(12)

随笔分类

我的博客

搜索

  •  

积分与排名

  • 积分 - 299475
  • 排名 - 84

最新评论

阅读排行榜

这只是一个很小的细节问题,更详细的内容可以搜索《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指针,然后才执行用户代码,所以虚函数一样失去作用。
posted on 2006-09-11 21:56 LOGOS 阅读(705) 评论(1)  编辑 收藏 引用

FeedBack:
# re: 虚函数在构造函数与析构函数中失效 2006-09-13 15:13 pdkui
虚函数在构造和析构的时候是没作用,但析构函数本身可以是虚函数。  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理