On The Road
(cond ((less 'code) (less 'bug)))
C++博客
首页
新随笔
联系
聚合
管理
随笔 - 119 文章 - 290 trackbacks - 0
博客搬家了哦,请移步
叫我abc
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(12)
给我留言
查看公开留言
查看私人留言
随笔分类
《GAME PROGRAMMING GEMS6》读书笔记(4)
《UNIX编程艺术》读书笔记(4)
month-flow(5)
mysql入门(3)
垃圾收集(4)
我的博客
叫我abc
博客搬家啦
搜索
积分与排名
积分 - 301918
排名 - 84
最新评论
1. re: C++ std::fstream open mode
i'am got
--hdj
2. re: cppcheck的使用
你好,你会使用cppcheck吗?@robert
--wqq
3. re: 垃圾收集的那点事(H)
非常感谢
--7Qing_
4. re: 高效调用lua函数
为什么提示没有findLuaItem这个函数?
--sdfasf
5. re: android ndk调试知识[未登录]
博主你好,请问如果没有.so的源代码,应该如何进行arm的汇编级调试呢?
--dennis
阅读排行榜
1. cppcheck的使用(16931)
2. 十步精通新语言(10624)
3. 内存池实现(9864)
4. 高效调用lua函数(9201)
5. 在lua脚本中使用unicode(8157)
虚函数在构造函数与析构函数中失效
这只是一个很小的细节问题,更详细的内容可以搜索《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
阅读(715)
评论(1)
编辑
收藏
引用
FeedBack:
#
re: 虚函数在构造函数与析构函数中失效
2006-09-13 15:13
pdkui
虚函数在构造和析构的时候是没作用,但析构函数本身可以是虚函数。
回复
更多评论
刷新评论列表
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理