我们的代码
中有以下类结构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的位置。
有没有人可以告诉我一个解决方案。提前谢谢。
玩家
答案 0 :(得分:5)
我刚刚解决了这个问题的一个例子;通过网络搜索发现了这个问题。
在我的情况下,我还有一个继承自多个类的对话框类:CDialog和ConfigurationTab,它是一个内部接口。 通过更改:
使编译器警告静音class Foo : public ConfigurationTab, public CDialog
使用:
class Foo : public CDialog, public ConfigurationTab
当一个违规对话框在一个DDX变量赋值时在ON_BN_CLICKED方法内崩溃时,我们发现了这种情况。当我们确定它被初始化时,DDX变量在该行神秘地未初始化。
答案 1 :(得分:2)
我没有安装V9,但是我可以看到VS6和VC8之间的ON_WM_SIZE定义已经改变为语义相同,但它接受的更严格。 VC6使用C强制转换,其中VC8使用C ++强制转换,可以解决更多问题。
我们需要查看您的类OnSize方法的实际声明,我认为能够确定这里出了什么问题。
答案 2 :(得分:1)
只是猜测,自从我做了MFC以来已经有一段时间了,但看起来它让你的多重继承感到困惑
BEGIN_MESSAGE_MAP(class,baseclass)
扩展为调用'class'中的方法,因为A是多重继承的,它不确定要使用哪一个,也许你在几个基类中有相同的方法?
答案 3 :(得分:0)
在我的例子中,类Base2有虚方法。例如
class Base2
{
virtual void method(){};
}
,当我使用
时会发出警告Class A: public CDialog, public Base1, public virtual Base2
{
};
定义A类。
如果我在这里删除虚拟关键字。
Class A: public CDialog, public Base1, public Base2
{
};
然后警告就消失了。请注意我没有在Base2的主体中删除虚拟。就在A类定义中。
希望它可以帮到你。