C++ 警告C4407可能导致哪些问题?
通过多重继承,在一些MFCC++ 警告C4407可能导致哪些问题?,c++,mfc,multiple-inheritance,C++,Mfc,Multiple Inheritance,通过多重继承,在一些MFCCWnd派生对象上使用纯虚拟接口,我得到了一些警告。我相信这是因为定义了需要为消息映射实现的方法 warning C4407: cast between different pointer to member representations, compiler may generate incorrect code 这听起来不仅仅是一个警告,更像是可能导致堆损坏的东西。那么,有没有其他类似于下面的方法,不会导致MFC动态下行宏比通常情况下阻塞 class ISomeI
CWnd
派生对象上使用纯虚拟接口,我得到了一些警告。我相信这是因为定义了需要为消息映射实现的方法
warning C4407: cast between different pointer to member representations, compiler may generate incorrect code
这听起来不仅仅是一个警告,更像是可能导致堆损坏的东西。那么,有没有其他类似于下面的方法,不会导致MFC动态下行宏比通常情况下阻塞
class ISomeInterface
{
public:
virtual LRESULT OnSomeRegisteredMessage(WPARAM wp, LPARAM lp) = 0;
};
class CSomeCoolWnd : public CWnd, public ISomeInterface
{
public:
LRESULT OnSomeRegisteredMessage(WPARAM wp, LPARAM lp);
};
BEGIN_MESSAGE_MAP(CSomeCoolWnd , CWnd)
ON_REGISTERED_MESSAGE(WM_USER_DEFINED, &CSomeCoolWnd::OnSomeRegisteredMessage)
END_MESSAGE_MAP()
我想到的唯一一件事就是从接口中注释掉消息处理程序,并留下注释告诉消费者应该实现它们。但是,最好是通过编译器错误强制执行,而不是让他们使用接口,并在运行时由于缺少某些内容而获得意外的结果。在文章中可以找到指针指向成员值的不同表示形式的精彩描述。本质上,所有不同的继承类型都可能需要使用不同的成员函数指针表示。这是特定于编译器的,本文讨论了许多不同的编译器(直到2005年撰写本文为止)
显然,与指向成员函数的简单指针相比,在虚拟函数中使用多重继承可能需要不同的表示形式。在您发布的代码中可能看不到注册消息()上的
中的某个强制转换。请尝试使用以下方法:
class ISomeInterface
{
public:
virtual LRESULT OnSomeRegisteredMessage(WPARAM wp, LPARAM lp) = 0;
};
class CSomeCoolWnd : public CWnd, public ISomeInterface
{
public:
LRESULT OnSomeRegisteredMessage(WPARAM wp, LPARAM lp);
};
typedef void (CSomeCoolWnd::*FNMETHOD) (WPARAM, LPARAM);
FNMETHOD method = &CSomeCoolWnd::OnSomeRegisteredMessage;
BEGIN_MESSAGE_MAP(CSomeCoolWnd, CWnd)
ON_REGISTERED_MESSAGE(WM_USER_DEFINED, method)
END_MESSAGE_MAP()
这听起来很严重,我不想忽视它。我有一个解决办法,如前所述。我只是更喜欢将消息处理程序作为抽象基类的一部分。