Maison >développement back-end >C++ >Comment accéder aux membres publics d'une classe de base basée sur un modèle en C ?

Comment accéder aux membres publics d'une classe de base basée sur un modèle en C ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-01 15:12:31186parcourir

How Can You Access Public Members of a Templated Base Class in C  ?

Invisibilité des membres publics dans l'héritage de classe modélisé

Considérez le code C suivant :

<code class="cpp">class CBase {
public:
    char Arr[32];
    int Fn1();
    int Fn2();
};

class CDerived : public CBase {
public:
    int FnSum();
};</code>

Dans ce code, CDerived hérite des membres publics de CBase. Cependant, si ce code est modélisé, ce qui rend Arr et les fonctions modélisés, les membres publics de CBase deviennent invisibles pour CDerived.

Solutions

Pour résoudre ce problème, plusieurs des solutions existent :

  • Solution n°1 : Préfixez toutes les références aux membres CBase avec CBase::, où BYTES est le paramètre du modèle.
  • Solution n°2 : Préfixez toutes les références aux membres CBase avec this->.
  • Solution n°3 : Utilisez l'instruction using dans CDerived pour déclarer tous les membres CBase nécessaires .

Problème avec les solutions

Les solutions n°1 et n°2 nécessitent des ajouts verbeux au code, ce qui entraîne un gonflement des sources et des répétitions. La solution n°4, désactivant la stricte conformité, n'est pas portable et s'éloigne du standard C.

Solution améliorée

Pour simplifier le code, on peut utiliser des macros pour automatiser l'ajout de l'instruction using dans la solution n°3 :

<code class="cpp">#define USING_CBASE(param) USING_ALL(CBase<param>, Arr, Fn1, Fn2, Fn3, Fn4, Fn5)

// In CDerived<BYTES>, in a `public:` section
USING_CBASE(BYTES);</code>

Cette macro générera automatiquement les instructions using nécessaires pour tous les membres de CBase qui sont utilisés dans CDerived.

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