Substituições explícitas (C++/CLI e C++/CX)

Este tópico discute como substituir explicitamente um membro de uma classe ou interface base. Uma substituição nomeada (explícita) deve ser usada apenas para substituir um método por um método derivado que tenha um nome diferente.

Todos os Runtimes

Sintaxe

overriding-function-declarator = type::function [,type::function] { overriding-function-definition }
overriding-function-declarator = function { overriding-function-definition }

Parâmetros

overriding-function-declarator
O tipo de retorno, nome e lista de argumentos da função de substituição. Observe que a função de substituição não precisa ter o mesmo nome da função que está sendo substituída.

tipo
O tipo base que contém uma função para substituir.

function
Uma lista delimitada por vírgulas de um ou mais nomes de função a serem substituídos.

overriding-function-definition
As instruções do corpo da função que definem a função de substituição.

Comentários

Use substituições explícitas para criar um alias para uma assinatura de método ou para fornecer diferentes implementações para métodos com a mesma assinatura.

Saiba mais sobre como modificar o comportamento de tipos e membros de tipo herdados em Especificadores de Substituição.

Windows Runtime

Requisitos

Opção do compilador: /ZW

Common Language Runtime

Comentários

Saiba mais sobre substituições explícitas em código nativo ou compilado com /clr:oldSyntax em Substituições explícitas.

Requisitos

Opção do compilador: /clr

Exemplos

O exemplo de código a seguir mostra uma substituição simples e implícita e a implementação de um membro em uma interface base, não usando substituições explícitas.

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

O exemplo de código a seguir mostra como implementar todos os membros da interface com uma assinatura comum, usando a sintaxe de substituição explícita.

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

O exemplo de código a seguir mostra como uma substituição de função pode ter um nome diferente da função que está implementando.

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

O exemplo de código a seguir mostra uma implementação de interface explícita que implementa uma coleção segura de tipo.

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

Confira também

Extensões de componentes para .NET e UWP