Явные переопределения (расширения компонентов C++)
В этом разделе описываются способы явного переопределения члена базового класса или интерфейса. Именованное (явное) переопределение должно использоваться только для переопределения метода производным методом с другим именем.
Все среды выполнения
Синтаксис
overriding-function-declarator = type::function [,type::function] { overriding-function-definition }
overriding-function-declarator = function { overriding-function-definition }
Параметры
overriding-function-declarator
Возвращаемый тип, имя и список аргументов переопределяющей функции. Обратите внимание, что переопределяющая функция не должна иметь то же имя, что и переопределяемая функция.type
Базовый тип, содержащий функцию для переопределения.function
Список из одного или нескольких имен функций, которые следует переопределить.overriding-function-definition
Операторы тела функции, которые определяют переопределяющую функцию.
Примечания
Явное переопределение используется для создания псевдонима сигнатуры метода или для предоставления различных реализаций методов с одной и той же сигнатурой.
Дополнительные сведения об изменении поведения унаследованных типов и членов унаследованных типов см. в разделе Спецификаторы переопределения (расширения компонентов C++).
Среда выполнения Windows
Требования
Параметр компилятора: /ZW
Среда CLR
Примечания
Дополнительные сведения о явных переопределениях в собственном коде или для кода, компилируемого с использованием параметра /clr:oldSyntax см. в разделе Явные переопределения (C++).
Требования
Параметр компилятора: /clr
Примеры
Пример
В следующем примере кода показано простое неявное переопределение и реализация члена базового интерфейса без использования явных переопределений.
// explicit_override_1.cpp
// compile with: /clr
interface struct I1 {
virtual void f();
};
ref class X : public I1 {
public:
virtual void f() {
System::Console::WriteLine("X::f override of I1::f");
}
};
int main() {
I1 ^ MyI = gcnew X;
MyI -> f();
}
Output
Пример
В следующем примере показано, как реализовать все члены интерфейса с общей сигнатурой, используя синтаксис явного переопределения.
// explicit_override_2.cpp
// compile with: /clr
interface struct I1 {
virtual void f();
};
interface struct I2 {
virtual void f();
};
ref struct X : public I1, I2 {
virtual void f() = I1::f, I2::f {
System::Console::WriteLine("X::f override of I1::f and I2::f");
}
};
int main() {
I1 ^ MyI = gcnew X;
I2 ^ MyI2 = gcnew X;
MyI -> f();
MyI2 -> f();
}
Output
Пример
В следующем примере кода показано, как переопределение функции может иметь имя отличное от имени функции, которую она реализует.
// explicit_override_3.cpp
// compile with: /clr
interface struct I1 {
virtual void f();
};
ref class X : public I1 {
public:
virtual void g() = I1::f {
System::Console::WriteLine("X::g");
}
};
int main() {
I1 ^ a = gcnew X;
a->f();
}
Output
Пример
В следующем примере кода показана явная реализация интерфейса, реализующая типобезопасную коллекцию.
// explicit_override_4.cpp
// compile with: /clr /LD
using namespace System;
ref class R : ICloneable {
int X;
virtual Object^ C() sealed = ICloneable::Clone {
return this->Clone();
}
public:
R() : X(0) {}
R(int x) : X(x) {}
virtual R^ Clone() {
R^ r = gcnew R;
r->X = this->X;
return r;
}
};