Наследование в C ++ / CX не то же самое, что наследование в C ++. Это связано с тем, что классы ссылок C ++ / CX на самом деле являются COM-объектами, которые реализуют наследование посредством различных агрегатов.
Пример, с которым я работал, был
public ref class MyTextBox : public TextBox {
MyTextBox() {};
~MyTextBox() {};
virtual void OnKeyDown(KeyEventArgs^ e) override {
TextBox::OnKeyDown(e);
};
};
что не сработает, потому что TextBox :: OnKeyDown () будет эффективно вызывать MyTextBox :: OnKeyDown (). Это связано с тем, как виртуальные методы реализованы в C ++ / CX и COM, подробный обзор можно прочитать на здесь.
Предварительная версия решения для разработчиков Visual Studio 11
Краткая версия заключается в том, что метод OnKeyDown () является частью интерфейса IControlOverrides, реализованного как MyTextBox, так и TextBox, благодаря некоторым умным трюкам компилятора. Чтобы получить указатель интерфейса для реализации TextBox, нам сначала нужно запросить его у TextBox - если мы попросим MyTextBox, мы окажемся там, где начали. И поскольку это наследование в COM, а не в C ++, мы делаем это с помощью указателя на объект baseclass вместо this:
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. Хотя «__super ::» по-прежнему не работает, теперь он отлично работает, просто чтобы явно вызвать интерфейс, в котором он определен:
virtual void OnKeyDown(KeyEventArgs^ e) override {
IControlOverrides::OnKeyDown(e);
};
Обозреватель объектов в VS покажет вам, какой интерфейс метода OnKeyDown () определен в (IControlOverrides).
Проблема решена!
person
Ludvig A. Norin
schedule
28.02.2012
__super? - person user1227804   schedule 28.02.2012