【问题标题】:What problems could warning C4407 cause?警告 C4407 会导致哪些问题?
【发布时间】: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


【解决方案1】:

可以在文章Member Function Pointers and the Fastest Possible C++ Delegates 中找到对指向成员值的不同表示的出色描述。本质上,所有不同的继承类型都可能需要使用不同的成员函数指针表示。这是特定于编译器的,本文讨论了许多不同的编译器(截至 2005 年撰写本文时)。

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

【讨论】:

    【解决方案2】:

    尝试使用这样的东西:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-04
      • 1970-01-01
      相关资源
      最近更新 更多