繼承在C++/CX中是而不是與C++中的繼承相同。這是因爲C++/CX ref類實際上是COM對象,它通過各種聚合來實現繼承。
我一起工作的例子是
public ref class MyTextBox : public TextBox {
MyTextBox() {};
~MyTextBox() {};
virtual void OnKeyDown(KeyEventArgs^ e) override {
TextBox::OnKeyDown(e);
};
};
這將無法工作,因爲文本框::的onkeydown()將有效調用MyTextBox ::的onkeydown()。這是因爲在C++/CX和COM中如何實現虛擬方法,因此可以深入閱讀here。
的Visual Studio 11開發者預覽版解決方案
短的版本是,的onkeydown()方法是IControlOverrides接口的一部分,雙方MyTextBox和文本框來實現,這要歸功於一些聰明的編譯器技巧。爲了獲得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 Beta版解決方案
由於有這麼很多其他的東西,這已經在VS 11 Beta中得到了改進。雖然「__super ::」仍然無法工作,現在工作得很好只是撥打電話,以明確其所定義的接口:該接口的onkeydown
virtual void OnKeyDown(KeyEventArgs^ e) override {
IControlOverrides::OnKeyDown(e);
};
在VS對象瀏覽器會告訴你()方法在(IControlOverrides)中定義。
問題解決!
在C++/cx中沒有'__super'關鍵字嗎? – user1227804 2012-02-28 11:23:23
__super是typedef到基類,這意味着它與在此示例中執行TextBox :: OnKeyDown(...)相同。 – 2012-02-28 12:26:52