警告C4407会导致什么问题?

What problems could warning C4407 cause?

本文关键字:什么 问题 C4407 警告      更新时间:2023-10-16

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

我唯一想到的是注释掉接口中的消息处理程序,并留下注释,告诉消费者应该实现它们。但是,通过编译器错误强制执行这一点比让他们使用接口并在运行时从丢失的东西中获得意想不到的结果要好。

可以在成员函数指针和最快的c++委托这篇文章中找到关于指针到成员值的不同表示的优秀描述。基本上,所有不同的继承类型都需要使用不同的成员函数指针表示。这是特定于编译器的,本文讨论了许多不同的编译器(直到2005年撰写本文时)。

显然,在虚函数中使用多重继承可能需要与简单的成员指针函数不同的表示。

可能在ON_REGISTERED_MESSAGE()的某个地方,在你发布的代码中不可见。

试着这样写:

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()