CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

关于多重继承的问题

楼主yzx0023(无聊客)2006-03-08 20:11:59 在 C/C++ / C++ 语言 提问

同样的代码在VC6中能够编译通过,但是EVC4就不行,还望高手指教:  
  首先我创建了一个标准的MFC   EXE工程,在随便加了个自定义的类:  
  class   CTest  
  {  
  public:  
  CTest(){};  
  virtual   ~CTest(){};  
  virtual   BOOL   TestOut(){return   TRUE;}  
  };  
   
  再修改原先默认的CMainFrame定义,改以后为:  
  class   CMainFrame   :   public   CFrameWnd,   public   CTest  
  {  
  ......  
  };  
   
  然后编译,发现VC6正常通过,但是EVC4报错,错误出现先在消息定义里:  
  BEGIN_MESSAGE_MAP(CMainFrame,   CFrameWnd)  
  ......  
  ON_NOTIFY(DLN_CE_CREATE,   AFXCE_ID_DOCLIST,   OnCreateDocList)   //这句出错  
  ......  
  END_MESSAGE_MAP()  
   
  E:\MyWork\TestEVC\MainFrm.cpp(30)   :   error   C2440:   'type   cast'   :   cannot   convert   from   'void   (__thiscall   CMainFrame::*)(struct   tagDLNHDR   *,long   *)'   to   'void   (__thiscall   CCmdTarget::*)(struct   tagNMHDR   *,long   *)'  
                  Pointers   to   members   have   different   representations;   cannot   cast   between   them  
   
  不解,请教高手这是什么原因?谢谢! 问题点数:50、回复次数:14Top

1 楼jixingzhong(瞌睡虫·星辰)回复于 2006-03-08 20:40:10 得分 2

和环境的一些定义(或者说是   限制)有关Top

2 楼wzjall(风)回复于 2006-03-08 20:46:16 得分 2

改变一下你的函数调用方式看看!(在开发环境中设置)Top

3 楼yzx0023(无聊客)回复于 2006-03-08 20:50:18 得分 0

能不能具体说明下?不理解多重继承为什么会产生这个问题Top

4 楼t_jl1979(骑士)回复于 2006-03-08 21:05:18 得分 10

你说的不错,这个的确是由于多重继承产生的.  
  MFC并没有使用C++的标准多重继承方式,而是使用宏来解决这个问题的.是同编译起绑定的.  
  我不清楚EVC是什么,估计用的编译器不是MS的.这个问题,你要看深入理解C++对象模型,与深入浅出MFC这两本书就ok了.Top

5 楼t_jl1979(骑士)回复于 2006-03-08 21:07:05 得分 10

补一下,就算是MS的编译器,不同版本也不好说,处理一样不一样.Top

6 楼wshcdr(dd)回复于 2006-03-08 21:13:49 得分 10

OnCreateDocList函数的   第一个   形参struct   tagDLNHDR   *,   改为   struct   tagNMHDR   *   试试Top

7 楼t_jl1979(骑士)回复于 2006-03-08 21:20:22 得分 0

还要补一下,应该说,MFC的消息传递机制,是使用宏来完成的,而不是C++的多重继承.但是他看起来就是多重继承.汗.Top

8 楼defyer007(深入浅出)回复于 2006-03-08 21:30:33 得分 2

mark...Top

9 楼yzx0023(无聊客)回复于 2006-03-09 08:48:43 得分 0

...Top

10 楼fisker0303(天塌了,地陷了,小花狗不见了.)回复于 2006-03-09 09:12:03 得分 2

那是一个宏,你可以把它展开看看,到底出错在哪儿?Top

11 楼hdt(倦怠)回复于 2006-03-09 09:42:53 得分 2

vc6   能过只是因为他对c++标准支持的不完全  
  Top

12 楼yzx0023(无聊客)回复于 2006-03-10 11:55:03 得分 0

再顶,每人能说说具体原因吗?Top

13 楼yzx0023(无聊客)回复于 2006-03-15 15:27:46 得分 0

......Top

14 楼ringphone(临风)回复于 2006-03-15 17:43:05 得分 10

#define   ON_NOTIFY(wNotifyCode,   id,   memberFxn)   \  
  {   WM_NOTIFY,   (WORD)(int)wNotifyCode,   (WORD)id,   (WORD)id,   AfxSig_vNMHDRpl,   \  
  (AFX_PMSG)(void   (AFX_MSG_CALL   CCmdTarget::*)(NMHDR*,   LRESULT*))&memberFxn   },  
   
   
  ON_NOTIFY宏会把CMainFrame::OnCreateDocList强制转换成void   AFX_MSG_CALL   CCmdTarget::*  
  类型,即CMainFrame父类的函数指针,但现在由于CMainFrame是多重继承,估计EVC4认为转不了了。Top

相关问题

  • 关于多重继承的问题
  • 关于多重继承的问题?
  • 在VC里的多重继承问题
  • 多重继承和虚函数问题
  • 怎样用接口(interface)实现多重继承?
  • 关于多重继承和虚函数的问题。
  • 多重继承时,派生类的VTable问题
  • 调查!大家对虚拟函数、多重继承的看法。
  • 有关多重继承下的virtual function一问
  • 怎样在vc中实现多重继承?

关键词

  • c++
  • 函数
  • vc
  • word
  • 多重继承
  • oncreatedoclist
  • cmainframe
  • ctest
  • evc4
  • ccmdtarget

得分解答快速导航

  • 帖主:yzx0023
  • jixingzhong
  • wzjall
  • t_jl1979
  • t_jl1979
  • wshcdr
  • defyer007
  • fisker0303
  • hdt
  • ringphone

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo