Maison >développement back-end >C++ >Comment puis-je appeler une méthode de classe de base à partir d'une classe dérivée qui l'a remplacée ?

Comment puis-je appeler une méthode de classe de base à partir d'une classe dérivée qui l'a remplacée ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-30 06:07:121021parcourir

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

Appel de base.base.method() Exceptionnellement

Lors de la dérivation de classes à partir d'une structure de base, le mot-clé base permet l'accès aux membres définis dans la classe parent immédiate. Cependant, dans des situations exceptionnelles, il peut s'avérer nécessaire d'invoquer des méthodes de classes situées plus haut dans la hiérarchie d'héritage.

Considérez le scénario de code fourni, où Derived remplace Say() méthode de Base. Dans SpecialDerived, un remplacement ultérieur de Say() appelle base.Say(), dans l'intention d'exécuter Say() à partir de Base.

Attendu vs réel Comportement

Le résultat attendu est :

Called from Special Derived.
Called from Base.

Cependant, en raison de la nature du remplacement de méthode, le résultat réel inclut un appel inattendu à Say() de Dérivé :

Called from Special Derived.
Called from Derived.
Called from Base.

Répondre au Problème

Étant donné que l'invocation directe de base.base.method() n'est pas prise en charge, une approche alternative est nécessaire. L'implémentation mise à jour fournie dans SpecialDerived démontre ceci :

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.");
    }
}

En définissant une méthode virtuelle protégée supplémentaire, CustomSay(), Derived peut gérer le comportement souhaité sans affecter les autres classes dérivées.

Réflexion alternative Approche

Dans les scénarios où la modification de la structure d'héritage n'est pas réalisable, une approche basée sur la réflexion peut être utilisée comme indiqué ci-dessous :

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();            
    }
}

Cette approche utilise la réflexion pour récupérer dynamiquement le Say() depuis Base et exécutez-la directement, en contournant la résolution de méthode standard processus.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn