要实现接口的话,必须使用多重继承机制

要实现接口的话,必须使用多重继承机制,第1张

要实现接口的话,必须使用多重继承机制,第2张

在C++中,如果要实现接口,就必须使用多重继承机制。在MFC中,如果我们有一个类,我们需要从MFC窗口类派生并在我们的程序中实现一个接口,如下面的代码。
class mybase class
{
Public:
virtual ~ mybase class(){ }
}
class my dialog:Public mybase class,Public ialog
{
...
}
如果给这个类添加消息映射函数,Exam。大提示:添加OnLButtonDown消息函数
类mybase class
{
public:
virtual ~ mybase class(){ }
}
class my dialog:public mybase class,public CDialog
{
public:
DECLARE _ MESSAGE _ MAP()
afx _ msg void onlbutton down(UINT flag,CPoint point);
}
/。c文件
begin _ message _ map(我的对话框,CDialog)
on _ WM _ lbuttondown()
end _ message _ map()
void my dialog::onlbuttondown(uint flag,c point)
{
}[/
出现这种异常的原因很简单,但调查过程仍然很困难。显然,这个异常的原因是它出现在消息映射部分。
我们来看一下宏ON_WM_LBUTTONDOWN()的定义:
# define ON _ WM _ LBUTTONDOWN()\
{ WM _ LBUTTONDOWN,0,0,0,afxsig _ vwp,\
(afx _ pmsg)(afx _ PMS GW)\
(static _ cast < void(afx _ msg _ callc wnd::*)(uint,cpoint)>(& this class::quot
这样我们就完全可以理解,一个对象成员函数的指针类型必须有两个参数:变量地址和成员函数的地址。MFC函数调用时是这样调用的:
(this-> * MMF . pfn _ v _ u _ p)(static _ cast(wparam),point);
其中mmf.pfn_v_u_p是MyDialog::OnLButtonDown的地址,对象的地址(MyDialog对象的地址)直接作为CWnd的地址。因此,MFC类必须是第一个父类。作为第二个父类,对象地址和CWnd地址之间有一个虚函数表指针大小的差别。这个虚函数表就是第一个父类的必选函数表(当然第一个父类至少要包含一个虚函数。不相信这个问题的朋友可以尝试在第一个父类中不声明任何虚函数,此时这个问题就消除了)。这应该是MFC实现中的一个疏忽,因为你可以简单地在DECLARE_MESSAGE_MAP()宏中添加一个虚函数:
# define DECLARE _ MESSAGE _ MAP()\
MFC _ DECLARE _ MESSAGE _ MAP();\
virtual GetMFCObject(){ return(CObject *)this;}
调用消息映射函数时,改为:
(this-> getmfcobject()--> * MMF . pfn _ v _ u _ p)(static _ cast(wparam),point);
应该没问题。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 要实现接口的话,必须使用多重继承机制

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情