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
Libérer: 2024-12-30 06:07:12
original
1003 Les gens l'ont consulté

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.
Copier après la connexion

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.
Copier après la connexion

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.");
    }
}
Copier après la connexion

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();            
    }
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal