兔子的技术博客

兔子

   :: 首页 :: 联系 :: 聚合  :: 管理
  202 Posts :: 0 Stories :: 43 Comments :: 0 Trackbacks

留言簿(10)

最新评论

阅读排行榜

评论排行榜


如下多重集成的代码:
1 class CTaurusMainDlg :    public CDGClient,
2                                                public CDialog
3 {
4     DECLARE_DYNAMIC(CTaurusMainDlg)
5 
6 public:
7     CTaurusMainDlg(CWnd* pParent = NULL);   // 标准构造函数
8     virtual ~CTaurusMainDlg();
9 。。。。。

CDGClient 类是一个从抽象类派生的类(有两个抽象基类)。
当在调试状态下运行时,输出窗口中出现一下信息:



转到出错地址 0x00ed65b5 :


图中的汇编码将 this 指针指向的四个字节内容作为虚函数表地址(edx),惊异的发现,虚函数表指针为零!有妖怪???

为了验证汇编码的结果,在 CTaurusMainDlg 的某一个窗口函数中设下断点后,查看其成员:



如图中所示,发现虚函数表指针果然为零!真的有妖怪???

但是将 CDialog 和 CDGClient 的顺序交换则无此问题,如下:

1 class CTaurusMainDlg :    public CDialog,
2                                                public CDGClient
3 {
4     DECLARE_DYNAMIC(CTaurusMainDlg)
5 
6 public:
7     CTaurusMainDlg(CWnd* pParent = NULL);   // 标准构造函数
8     virtual ~CTaurusMainDlg();
9 
posted on 2009-09-18 19:19 会飞的兔子 阅读(1197) 评论(3)  编辑 收藏 引用 所属分类: C++及开发环境

Feedback

# re: 多重继承导致虚函数表为空! 2010-08-17 10:14 过客
这个问题把我搞了一天,谢谢你的解决方案!!  回复  更多评论
  

# re: 多重继承导致虚函数表为空! 2011-03-02 15:42 马超
为什么换下就OK了呢  回复  更多评论
  

# re: 多重继承导致虚函数表为空! 2011-06-10 21:39 会飞的兔子
@马超
不知道啥原因,也许是 VS2008 的bug 吧
不知道 vs2010 是否有问题,有兴趣可以试试  回复  更多评论
  


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