Поделиться через


Явные переопределения (C++/CLI и C++/CX)

В этом разделе рассматривается явное переопределение элемента базового класса или интерфейса. Именованное (явное) переопределение должно использоваться только для переопределения метода производным методом с другим именем.

Все среды выполнения

Синтаксис

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
Операторы тела функции, которые определяют функцию переопределения.

Замечания

Используйте явные переопределения для создания псевдонима для сигнатуры метода или предоставления различных реализаций для методов с одной и той же сигнатурой.

Сведения об изменении поведения унаследованных типов и их членов см. в разделе Спецификаторы переопределения.

Среда выполнения Windows

Требования

Параметр компилятора: /ZW

Среда CLR

Замечания

Сведения о явных переопределениях в машинном или скомпилированном коде с /clr:oldSyntax см. в разделе Явные переопределения.

Требования

Параметр компилятора: /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();
}
X::f override of I1::f

В следующем примере кода рассматривается реализация всех элементов интерфейса с распространенной подписью с использованием синтаксиса явного переопределения.

// 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();
}
X::f override of I1::f and I2::f
X::f override of I1::f and I2::f

В следующем примере кода демонстрируется, как переопределение функции может иметь имя, отличное от функции, которую она реализует.

// 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();
}
X::g

В следующем примере кода показана явная реализация интерфейса, реализующая типобезопасную коллекцию.

// 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;
   }
};

См. также

Расширения компонентов для .NET и UWP