【发布时间】:2011-09-26 23:29:48
【问题描述】:
我通过多重继承在一些 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()
我想出的唯一方法是从接口中注释掉消息处理程序,并让 cmets 告诉消费者他们应该实现它们。但是,最好通过编译器错误来强制执行这一点,而不是让他们使用接口并在运行时从丢失的东西中得到意外的结果。
【问题讨论】:
-
听起来很严重,我宁愿不要忽略它。
-
我有提到的解决方法。我只是希望将消息处理程序作为抽象基类的一部分包含在内。
标签: c++ mfc multiple-inheritance