Maison  >  Article  >  développement back-end  >  Pourquoi les identifiants de classe de base sont-ils inaccessibles dans les classes de modèles dérivées en C ?

Pourquoi les identifiants de classe de base sont-ils inaccessibles dans les classes de modèles dérivées en C ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-19 00:10:02397parcourir

Why Are Base Class Identifiers Inaccessible in Derived Template Classes in C  ?

Visibilité limitée des identifiants dans les classes de modèles dérivées

En C, les classes de modèles introduisent un aspect unique dans l'héritage : les identifiants définis dans une classe de modèle de base peut ne pas être visible pour les classes de modèles dérivées. Ce comportement, connu sous le nom de recherche en deux phases, est dû aux différentes étapes impliquées dans l'instanciation et la compilation du modèle.

Considérez l'exemple suivant :

template <typename T>
class Base
{
public:
    static const bool ZEROFILL = true;
    static const bool NO_ZEROFILL = false;
};

template <typename T>
class Derived : public Base<T>
{
public:
    Derived(bool initZero = NO_ZEROFILL);    // NO_ZEROFILL is not visible
    ~Derived();
};

Lors de la compilation de ce code, GCC g 3.4.4 (cygwin) produit une erreur, car Derived ne peut pas accéder à NO_ZEROFILL à partir de sa classe de base Base. En effet, lors de la première phase d'instanciation du modèle, lorsque le compilateur analyse le code, aucun type concret ne lui est attribué. Par conséquent, il ne peut pas déterminer la classe de base spécifique dont Derived hérite et ne peut donc pas résoudre les identifiants définis. au sein de la classe de base.

Pour surmonter cette limitation, une qualification explicite est requise lors de l'accès aux identifiants de classe de base dans les classes de modèles dérivés. Le code ci-dessous résout le problème :

template <typename T>
class Derived : public Base<T>
{
public:
    Derived(bool initZero = Base<T>::NO_ZEROFILL);    // Explicit qualification
    ~Derived();
};

En utilisant Base::NO_ZEROFILL, le compilateur est explicitement invité à rechercher l'identifiant dans la classe de base, même si le type concret de T n'est pas connu à ce stade.

Ainsi, dans les classes de modèles dérivés, les identifiants définis dans les classes de modèles de base ne sont accessibles qu'avec une qualification explicite, garantissant une résolution correcte au moment de l'exécution lorsque le modèle est instancié avec des types spécifiques.

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