Heim > Backend-Entwicklung > C++ > Wie kann ich eine Basisklassenmethode aus einer abgeleiteten Klasse aufrufen, die sie überschrieben hat?

Wie kann ich eine Basisklassenmethode aus einer abgeleiteten Klasse aufrufen, die sie überschrieben hat?

Barbara Streisand
Freigeben: 2024-12-30 06:07:12
Original
1003 Leute haben es durchsucht

How Can I Call a Base Class Method From a Derived Class That Has Overridden It?

Base.base.method() ausnahmsweise aufrufen

Beim Ableiten von Klassen aus einer Basisstruktur das Schlüsselwort base ermöglicht den Zugriff auf Mitglieder, die in der unmittelbaren übergeordneten Klasse definiert sind. In Ausnahmesituationen kann es jedoch erforderlich sein, Methoden von Klassen weiter oben in der Vererbungshierarchie aufzurufen.

Betrachten Sie das bereitgestellte Codeszenario, in dem Derived Say() überschreibt. Methode der Basis. Innerhalb von SpecialDerived ruft eine nachfolgende Überschreibung von Say() base.Say() auf, um Say() von Basis.

Erwartet vs. tatsächlich Verhalten

Die erwartete Ausgabe ist:

Called from Special Derived.
Called from Base.
Nach dem Login kopieren
Aufgrund der Art der Methodenüberschreibung enthält die tatsächliche Ausgabe jedoch einen unerwarteten Aufruf von

Say() von Abgeleitet:

Called from Special Derived.
Called from Derived.
Called from Base.
Nach dem Login kopieren

Adressierung das Problem

Da der direkte Aufruf von

base.base.method() nicht unterstützt wird, ist ein alternativer Ansatz erforderlich. Die bereitgestellte aktualisierte Implementierung in SpecialDerived zeigt dies:

class SpecialDerived : Derived
{
    public override void Say()
    {
        Console.WriteLine("Called from Special Derived.");
        CustomSay(); // Calls CustomSay() from Derived instead of Say()
        base.Say();
    }

    protected virtual void CustomSay()
    {
        Console.WriteLine("Called from Derived.");
    }
}
Nach dem Login kopieren
Durch die Definition einer zusätzlichen geschützten virtuellen Methode,

CustomSay(), kann Derived Behandeln Sie das gewünschte Verhalten, ohne andere abgeleitete Klassen zu beeinträchtigen.

Alternative Reflexion Ansatz

In Szenarien, in denen eine Änderung der Vererbungsstruktur nicht möglich ist, kann ein reflexionsbasierter Ansatz wie unten gezeigt verwendet werden:

class SpecialDerived : Derived
{
    public override void Say()
    {
        Console.WriteLine("Called from Special Derived.");
        var ptr = typeof(Base).GetMethod("Say").MethodHandle.GetFunctionPointer();            
        var baseSay = (Action)Activator.CreateInstance(typeof(Action), this, ptr);
        baseSay();            
    }
}
Nach dem Login kopieren
Dieser Ansatz nutzt Reflexion, um die zu dynamisch abzurufen

Say()-Methode von Base und führen Sie sie direkt aus, um die Standardmethodenauflösung zu umgehen Prozess.

Das obige ist der detaillierte Inhalt vonWie kann ich eine Basisklassenmethode aus einer abgeleiteten Klasse aufrufen, die sie überschrieben hat?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage