3

現在、C++クラスで奇妙なエラーが発生しています。新しい仮想関数を追加したActiveXラッパークラス(wxWidgetsの一部として)があります。ActiveXクラス(wxIEHtmlWin)を継承する別のクラスがありますが、ActiveXクラスは、それをオーバーライドするwxIEHtmlWinの関数ではなく、常に独自の関数を呼び出します。

なぜこれが起こっているのか理解できません。関数を純粋仮想にしましたが、関数呼び出しを実行するとプログラムがクラッシュしますが、それ以外の場合は正常にコンパイルされます。仮想機能を無効にする方法はありますか、またはVisual Studioにバグを見つけましたか?

ActiveXクラス

protected:
virtual FrameSite* getNewFrameSite()=0;

wxIEHtmlWinクラス

class wxIEHtmlWin : public wxActiveX
{
protected:
    FrameSite* getNewFrameSite();
}

FrameSite* wxIEHtmlWin::getNewFrameSite()
{
    return new gcFrameSite(this);
}

編集:別のテスト関数(intを返す)を追加しましたが、それでも失敗します。

問題のコードへのリンク:http://lodle.net/public/iebrowser.rar

編集:

以下の答えのおかげで、私はそれを機能させることができました。私がしたことは、2つの部分でactivexクラスを作成することでした(提案されたように)が、wxIEHtmlWinでは、コンストラクターコードの2番目の部分を呼び出しました。そのようです:

wxIEHtmlWin::wxIEHtmlWin(wxWindow * parent, wxWindowID id, const wxPoint& pos,const wxSize& size,long style, const wxString& name) : wxActiveX()
{
    wxActiveX::Create(parent, PROGID, id, pos, size, style, name);
    SetupBrowser();
}

これで、wxWidgetsが2つの部分からなる構造をサポートする理由がわかりました。

4

2 に答える 2

9

クラスのコンストラクター内から(別の呼び出しを介して)仮想メソッドを呼び出しています。サブクラスがまだ構築されていないため、これにより現在のクラスのメソッドが呼び出されます。修正は、init()メソッドを使用し、クラスの構築後に呼び出すことです。

つまり、次のようなものです。

class wxActivex {
  wxActivex() {}
  virtual void init() {
    getNewFrame();
  }
};

  // in the code that uses these classes:
  wxActivex *activex = new IEHtmlFrame();
  activex->init();
于 2008-12-24T08:23:30.943 に答える
1

この質問のより「煮詰めた」バージョンは、こちらにあります。しかし要するに、基本オブジェクトは (まだ) 派生型のインスタンスではないため、派生オブジェクトでオーバーロードされた関数を呼び出すことはできません。

于 2009-02-03T13:35:52.710 に答える