What problems could warning C4407 cause?(警告 C4407 会导致哪些问题?)
问题描述
我通过多重继承在一些 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.
这篇关于警告 C4407 会导致哪些问题?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:警告 C4407 会导致哪些问题?
基础教程推荐
- 从 std::cin 读取密码 2021-01-01
- 为什么语句不能出现在命名空间范围内? 2021-01-01
- 如何使图像调整大小以在 Qt 中缩放? 2021-01-01
- Windows Media Foundation 录制音频 2021-01-01
- 管理共享内存应该分配多少内存?(助推) 2022-12-07
- 使用从字符串中提取的参数调用函数 2022-01-01
- 如何“在 Finder 中显示"或“在资源管理器中显 2021-01-01
- 如何在不破坏 vtbl 的情况下做相当于 memset(this, ...) 的操作? 2022-01-01
- 为 C/C++ 中的项目的 makefile 生成依赖项 2022-01-01
- 在 C++ 中循环遍历所有 Lua 全局变量 2021-01-01