Maison  >  Article  >  développement back-end  >  Pourquoi les membres de la classe publique sont-ils invisibles lors de l’héritage de classes C basées sur un modèle ?

Pourquoi les membres de la classe publique sont-ils invisibles lors de l’héritage de classes C basées sur un modèle ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-04 09:25:02952parcourir

Why Are Public Class Members Invisible When Inheriting Templated C   Classes?

Héritage de la visibilité des membres de classe protégés et publics dans les classes C modélisées

Le problème de la visibilité des membres publics dans l'héritage devient apparent lorsqu'un modèle de classe hérite membres d’un autre modèle de classe, comme illustré dans le code fourni. Sans redéclarer ou redéfinir explicitement les membres publics, CDerived hérite de tous les membres publics de CBase.

Problème et solutions

La modélisation de ce code révèle cependant que les membres publics de CBase devenir invisible pour CDerived sur les compilateurs adhérant au dernier standard C. Ce problème de visibilité peut être résolu à l'aide de plusieurs solutions :

  1. Préfixer les références aux membres CBase avec CBase::
  2. Préfixer les références aux membres CBase avec this->
  3. Utilisation des instructions using pour des membres CBase spécifiques dans CDerived
  4. Désactivation de la stricte conformité à la norme C en activant le mode "permissif"

Inconvénients des solutions existantes

Bien qu'efficaces, ces solutions ont leurs inconvénients :

  • La solution n°4 s'éloigne du standard C et n'est pas portable.
  • Solutions n°1 et n°2 nécessitent des ajouts de code verbeux, entraînant une surcharge du code source.
  • La solution n°3 nécessite plusieurs instructions using, en particulier pour les classes de base étendues.

Une solution moins verbeuse

L'introduction de macros simplifie la solution n°3, réduisant ainsi la saisie répétitive :

<code class="cpp">#include <boost/preprocessor.hpp>

#define USING_ONE(r, base, member) using base::member;
#define USING_ALL(base, ...) BOOST_PP_SEQ_FOR_EACH(USING_ONE, base, BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__))

// Near CBase<BYTES>
#define USING_CBASE(param) USING_ALL(CBase<param>, Arr, Fn1, Fn2, Fn3, Fn4, Fn5)

// In CDerived<BYTES>
USING_CBASE(BYTES);</code>

Ce code simplifie considérablement les instructions using, améliorant la lisibilité du code et réduisant les modifications répétitives.

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