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 ?
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
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!