如下多重集成的代码:
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 类是一个从抽象类派生的类(有两个抽象基类)。
当在调试状态下运行时,输出窗口中出现一下信息:
![](http://www.cppblog.com/images/cppblog_com/flyinghare/200909210001.png)
转到出错地址 0x00ed65b5 :
![](http://www.cppblog.com/images/cppblog_com/flyinghare/200909210003.png)
图中的汇编码将 this 指针指向的四个字节内容作为虚函数表地址(edx),惊异的发现,虚函数表指针为零!有妖怪???
为了验证汇编码的结果,在 CTaurusMainDlg 的某一个窗口函数中设下断点后,查看其成员:
![](http://www.cppblog.com/images/cppblog_com/flyinghare/200909210002.png)
如图中所示,发现虚函数表指针果然为零!真的有妖怪???
但是将 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