Maison  >  Article  >  développement back-end  >  Comment éviter l'invisibilité des membres publics et la répétition du code source dans les modèles de classes hérités ?

Comment éviter l'invisibilité des membres publics et la répétition du code source dans les modèles de classes hérités ?

DDD
DDDoriginal
2024-11-04 04:49:01858parcourir

How to Avoid Public Member Invisibility and Source Code Repetition in Inherited Class Templates?

Éviter l'invisibilité des membres publics et la répétition du code source avec les modèles de classe hérités

Dans la programmation orientée objet, l'héritage permet aux classes d'hériter de propriétés et de méthodes de leurs classes parentales. Cependant, lorsque des modèles de classe sont introduits, les membres publics peuvent devenir inaccessibles aux classes dérivées en raison de la stricte conformité à la norme C. Ce problème peut entraîner des problèmes lors de la tentative de référencement de membres publics dans des classes dérivées.

Quatre solutions existantes à ce problème ont été suggérées :

  • Préfixer les références avec CBase
  • Préfixer les références avec this->
  • Utiliser des instructions individuelles using pour chaque membre
  • Désactivation de la conformité stricte en C

Bien que ces solutions puissent résoudre le problème d'accessibilité, elles présentent des inconvénients potentiels, tels qu'un code verbeux, des appels virtuels supprimés et la non-portabilité.

Solution améliorée proposée

Pour améliorer les solutions existantes, il est possible d'exploiter des macros pour simplifier la solution n°3 :

<code class="c++">#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>, in a `public:` section
USING_CBASE(BYTES);</code>

Cette approche nécessite l'ajout une macro USING_CBASE proche de la définition de CBase puis en appelant la macro dans la section publique de CDerived. Il effectue essentiellement une déclaration globale pour que tous les membres sélectionnés de CBase visible dans CDerived.

Cette solution répond aux préoccupations de la solution n°3, telles que le code répétitif, en encapsulant les instructions using dans des macros. Il maintient également la portabilité en se conformant aux normes C. Cette solution améliorée offre un moyen plus concis et efficace d'éviter l'invisibilité des membres publics et la répétition du code source dans les modèles de classe hérités.

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