C++/CXの継承は、ではなく、で、C++の継承と同じです。これは、C++/CXのrefクラスは実際にはCOMオブジェクトであり、さまざまな集約を通じて継承を実装しているからです。テキストボックス(TextBox)::は、OnKeyDown()が効果的にMyTextBoxを::は、OnKeyDownを呼び出しますので
は、私が働いていた例は()、動作しません
public ref class MyTextBox : public TextBox {
MyTextBox() {};
~MyTextBox() {};
virtual void OnKeyDown(KeyEventArgs^ e) override {
TextBox::OnKeyDown(e);
};
};
ました。これは、仮想メソッドがC++/CXおよびCOMでどのように実装されているかに基づいており、詳細な概要はhereとなります。
のVisual Studio 11の開発者プレビューソリューション
ショートバージョンは、OnKeyDown()メソッドは、MyTextBoxをとテキストボックスの両方により実現し、いくつかの巧妙なコンパイラのトリックのおかげでIControlOverridesインタフェースの一部であるということです。 TextBox実装用のインターフェイスポインタを取得するには、最初にTextBoxにそれを尋ねる必要があります.MyTextBoxに問い合わせると、私たちはどこから始めたのでしょう。これは継承がCOM、ないC++であるため、そして、私たちはやること基底クラスへのポインタを通じてオブジェクトの代わりに、この:
virtual void OnKeyDown(KeyEventArgs^ e) override {
struct IControlOverrides^ ico;
HRESULT hr = __cli_baseclass->__cli_QueryInterface(const_cast<class Platform::Guid%>(reinterpret_cast<const class Platform::Guid%>(__uuidof(struct IControlOverrides^))),reinterpret_cast<void**>(&ico));
if (!hr) {
hr = ico->__cli_OnKeyDown(e);
};
};
のVisual Studio 11ベータ版のソリューション
そうと同じようにこれはVS 11 Betaで改善されています。
が
virtual void OnKeyDown(KeyEventArgs^ e) override {
IControlOverrides::OnKeyDown(e);
};
VSでのオブジェクトブラウザは、あなたが表示されますは、OnKeyDownをインターフェイス:「__super ::」まだ動作しません、それは今も元気に動作している間だけ、それが定義されているインターフェイスに明示的に呼び出しを作るために()メソッドは(IControlOverrides)で定義されています。
問題が解決しました。
C++/cxに '__super'キーワードはありませんか? – user1227804
__superは、この例ではTextBox :: OnKeyDown(...)を実行するのと同じであるという意味で、ベースクラスにtypedefされています。 –