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

この問題のインスタンスを解決しました。Web検索でこの質問を見つけました。

私の場合、内部インターフェイスである 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(クラス、ベースクラス)

'class'のメソッドを呼び出すように拡張されます。したがって、Aは複数継承されているため、どちらを使用するかが不確実です。おそらく、いくつかの基本クラスに同じメソッドがありますか?

于 2010-01-22T07:33:36.413 に答える
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 の本体で virtual を削除していないことに注意してください。クラスAの定義だけです。

それがあなたを助けることを願っています。

于 2018-02-28T22:43:02.393 に答える