警告 C4407 会导致哪些问题?

2022-01-12 00:00:00 multiple-inheritance c++ mfc

我通过多重继承在一些 MFC CWnd 派生对象上使用纯虚拟接口得到了一些警告.我相信这是由定义需要为消息映射实现的方法引起的.

I got some warnings by using pure virtual interfaces on some MFC CWnd derived objects through multiple inheritance. I believe it's caused by defining the methods which need to be implemented for the message map.

warning C4407: cast between different pointer to member representations, compiler may generate incorrect code

这听起来不仅仅是一个警告,更像是可能导致堆损坏的东西.那么有没有另一种方法来做类似下面的事情,不会导致 MFC 动态向下转换宏比平时更阻塞?

That sounds like a bit more than a warning, more like something that might cause heap corruption. So is there another way to do something similar to below that won't cause the MFC dynamic downcast macros to choke anymore than usual?

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

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

The only thing I've come up with is commenting out the message handlers from the interfaces and leaving comments telling the consumer that they should implement them. However it would be nice to enforce that through a compiler error rather than letting them use an interface and get unexpected results at runtime from things being missing.

推荐答案

可以在文章 成员函数指针和最快的 C++ 委托.本质上,所有不同的继承类型都可能需要使用不同的成员函数指针表示.这是特定于编译器的,本文讨论了许多不同的编译器(截至 2005 年撰写本文时).

An excellent description of the different representations of pointer-to-member values can be found at the article Member Function Pointers and the Fastest Possible C++ Delegates. Essentially, all the different inheritance types can require the use of different member function pointer representations. This is compiler-specific and the article talks about a number of different compilers (up to 2005 when the article was written).

显然,您对虚函数的多重继承可能需要与简单的指向成员函数不同的表示形式.ON_REGISTERED_MESSAGE() 中的某处可能有一个演员表,这在您发布的代码中是不可见的.

Evidently your use of multiple inheritance with virtual functions may require a different representation than a simple pointer-to-member function. There's probably a cast somewhere in ON_REGISTERED_MESSAGE() that isn't visible in the code you posted.

相关文章