Явное переопределение элемента интерфейса
В Visual C++ синтаксис для объявления переопределения элемента интерфейса в классе изменился по сравнению с управляемыми расширениями для C++.
Часто требуется предоставить два экземпляра элемента интерфейса в классе, который реализует этот интерфейс. Первый используется при управлении объектами классов с помощью дескриптора интерфейса, а второй — при использовании объектов класса через интерфейс классов. Примеры.
public __gc class R : public ICloneable {
// to be used through ICloneable
Object* ICloneable::Clone();
// to be used through an R
R* Clone();
};
В управляемых расширениях это можно выполнить, предоставив явное объявление метода интерфейса и включив в имя метода имя интерфейса. Имя экземпляра конкретного класса не указывается. Это снижает необходимость образовывать производный тип для возвращаемого значения Clone (в данном примере) в случае явного вызова с помощью экземпляра R.
В новом синтаксисе используется новый механизм переопределения, заменивший синтаксис, который использовался в управляемых расширениях. Этот пример может быть переписан следующим образом:
public ref class R : public ICloneable {
public:
// to be used through ICloneable
virtual Object^ InterfaceClone() = ICloneable::Clone;
// to be used through an R
virtual R^ Clone();
};
Для подобного исправления необходимо, чтобы элемент интерфейса был явно переопределен и чтобы ему было присвоено уникальное имя в классе. Здесь использовалось странное имя InterfaceClone. Однако поведение остается прежним — с помощью интерфейса ICloneable вызывается переименованный элемент InterfaceClone,, в то время как с помощью объекта типа R вызывается второй экземпляр Clone.
См. также
Ссылки
Явные переопределения (расширения компонентов C++)
Основные понятия
Объявления членов в пределах класса или интерфейса (C++/CLI)