Explizite Überschreibungen (C++/CLI und C++/CX)

In diesem Thema wird erläutert, wie Sie einen Member einer Basisklasse oder -schnittstelle explizit überschreiben. Eine benannte (explizite) Überschreibung sollte nur zum Überschreiben einer Methode mit einer abgeleiteten Methode verwendet werden, die einen anderen Namen aufweist.

Alle Laufzeiten

Syntax

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

Parameter

overriding-function-declarator
Der Rückgabetyp, der Name und die Argumentliste der überschreibenden Funktion. Beachten Sie, dass die überschreibende Funktion nicht den gleichen Namen aufweisen muss wie die Funktion, die überschrieben wird.

type
Der Basistyp, der eine zu überschreibende Funktion enthält.

function
Eine durch Trennzeichen getrennte Liste mit zu überschreibenden Funktionsnamen.

overriding-function-definition
Die Funktionstextanweisungen, die die überschreibende Funktion definieren.

Hinweise

Verwenden Sie explizite Außerkraftsetzungen, um einen Alias für eine Methodensignatur zu erstellen oder verschiedene Implementierungen für Methoden mit derselben Signatur bereitzustellen.

Informationen zum Ändern des Verhaltens von geerbten Typen und geerbten Typmembern finden Sie unter Überschreibungsspezifizierer.

Windows-Runtime

Anforderungen

Compileroption: /ZW

Übersicht: Common Language Runtime (CLR)

Hinweise

Informationen zu expliziten Überschreibungen in nativem Code oder in mit /clr:oldSyntax kompiliertem Code finden Sie unter Explizite Überschreibungen.

Anforderungen

Compileroption: /clr

Beispiele

Das folgende Codebeispiel zeigt eine einfache, implizite Überschreibung und die Implementierung eines Members in einer Basisschnittstelle ohne Verwendung von expliziten Überschreibungen.

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

Das folgende Codebeispiel zeigt, wie Sie alle Schnittstellenmember mit einer gemeinsamen Signatur und unter Verwendung einer expliziten Überschreibungssyntax implementieren.

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

Das folgende Codebeispiel zeigt, wie eine Funktionsüberschreibung einen anderen Namen aufweisen kann als die Funktion, die sie implementiert.

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

Das folgende Codebeispiel zeigt eine explizite Schnittstellenimplementierung, die eine typsichere Auflistung implementiert.

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

Siehe auch

Komponentenerweiterungen für .NET und UWP