Maison >développement back-end >C++ >Les fonctions membres statiques peuvent-elles être virtuelles en C ?

Les fonctions membres statiques peuvent-elles être virtuelles en C ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-31 05:19:30241parcourir

Can Static Member Functions Be Virtual in C  ?

Comprendre les membres virtuels statiques en C

En C , il n'est pas possible de définir directement des fonctions membres qui sont à la fois statiques et virtuelles. Le compilateur émettra une erreur lors de la tentative de déclaration d'un "membre virtuel statique ()". Cependant, il existe des techniques pour obtenir une fonctionnalité équivalente.

Obtenir l'effet

Pour émuler le comportement d'une fonction membre virtuelle statique, envisagez l'approche suivante :

<code class="cpp">struct Object
{
    struct TypeInformation;

    static const TypeInformation &GetTypeInformation()
    {
        return GetTypeInformationImpl();
    }

protected:
    virtual const TypeInformation &GetTypeInformationImpl() const = 0;
};</code>

Ici, la fonction GetTypeInformation() est définie comme statique et renvoie une référence constante au type TypeInformation. Cependant, l'implémentation réelle de cette fonction est déléguée à la classe dérivée via la fonction virtuelle protégée GetTypeInformationImpl().

Avantages de cette approche :

  1. Répartition dynamique virtuelle : L'appel de Object::GetTypeInformation() sur une instance d'une classe dérivée invoquera l'implémentation de classe dérivée appropriée de GetTypeInformationImpl().
  2. Accès statique : Appel de Object::GetTypeInformation( ) directement à partir de la portée de la classe accédera toujours à l'implémentation de la classe de base, fournissant le comportement statique souhaité.

Notes supplémentaires :

  • Cette approche nécessite une fonction virtuelle non statique à définir dans la classe de base (dans ce cas, GetTypeInformationImpl()).
  • Si vous le souhaitez, des fonctions statiques non virtuelles explicites peuvent être fournies dans les classes dérivées pour permettre un accès non virtuel à l'implémentation de la classe dérivée.

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