4

我们的代码中有以下类结构

Class A: public CDialog, public Base1, public Base2
{
};

在A类的实现中,我们有以下内容:

BEGIN_MESSAGE_MAP( A, CDialog )
    ON_WM_SIZE()
END_MESSAGE_MAP()

请注意 Base1 和 Base2 不继承自 CDialog 或任何其他 MFC 类。

在 VC6 上编译成功。但在 VC9 上,我们得到以下错误代码:

错误 C4407:在指向成员表示的不同指针之间进行强制转换,编译器可能会生成不正确的代码

此错误代码指向 ON_WM_SIZE 的位置。

谁能告诉我一个解决方案。提前致谢。

游戏玩家

4

4 回答 4

6

我刚刚解决了这个问题的一个实例;通过网络搜索发现了这个问题。

在我的例子中,我还有一个继承自多个类的对话框类:CDialog 和 ConfigurationTab,这是一个内部接口。通过更改使编译器警告静音:

class Foo : public ConfigurationTab, public CDialog

和:

class Foo : public CDialog, public ConfigurationTab

当有问题的对话框在分配给 DDX 变量的 ON_BN_CLICKED 方法中崩溃时,我们发现了这种情况。当我们确定它已初始化时,DDX 变量在该行神秘地未初始化。

于 2013-03-12T17:33:12.483 回答
2

我手边没有安装的 V9,但我可以看到在 VS6 和 VC8 之间,ON_WM_SIZE 定义已更改为在语义上相同,但在接受的内容上要严格得多。VC6 使用了 C 类型转换,而 VC8 使用了 C++ 类型转换,这会发现更多问题。

我们需要查看您的 OnSize 方法类的实际声明,我认为能够确定这里出了什么问题。

于 2010-01-22T11:30:26.117 回答
1

只是猜测,自从我做 MFC 以来已经有一段时间了,但看起来它对你的多重继承感到困惑

BEGIN_MESSAGE_MAP(类,基类)

扩展为调用“类”中的方法,因此由于 A 是多重继承的,因此不确定要使用其中的哪一个,也许您在几个基类中有相同的方法?

于 2010-01-22T07:33:36.413 回答
0

就我而言, Base2 类具有虚拟方法。例如。

class Base2
{
 virtual void method(){};
}

当我使用时出现警告

Class A: public CDialog, public Base1, public virtual Base2
{
};

定义 A 类。

如果我在这里删除 virtual 关键字。

Class A: public CDialog, public Base1, public Base2
{
};

然后警告消失了。请注意,我没有在 Base2 的主体中删除 virtual。就在A类定义中。

希望它可以帮助你。

于 2018-02-28T22:43:02.393 回答