現在、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つの部分からなる構造をサポートする理由がわかりました。