C++ 警告C4407可能导致哪些问题?

C++ 警告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

通过多重继承,在一些MFC
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()

这听起来很严重,我不想忽视它。我有一个解决办法,如前所述。我只是更喜欢将消息处理程序作为抽象基类的一部分。