Maison >développement back-end >C++ >Comment une classe basée sur un modèle peut-elle hériter et accéder aux membres protégés de sa classe de base dépendante ?
Résolution de nom dépendant dans l'héritage basé sur un modèle
En C , la possibilité d'accéder aux variables héritées dépend du type d'héritage et du contexte. Considérons le code suivant, où Bar hérite d'une classe modèle Foo :
template<class T> class Foo { ... }; template<class T> class Bar : public Foo<T> { ... };
Dans ce scénario, la question se pose : Bar peut-il accéder à la variable protégée a de Foo ?
Conformité et justification de la norme
Les nouvelles versions du compilateur GNU C adhèrent à la norme C, qui stipule que les noms non qualifiés dans les modèles sont non dépendants. Cela signifie que ces noms doivent être résolus lorsque le modèle est défini. Cependant, comme la définition d'une classe de base dépendante (Foo) est inconnue à ce moment-là, les noms non qualifiés dans Bar ne peuvent pas être résolus.
Solution : Résolution de nom explicite
Pour accéder à a, Bar doit spécifier explicitement son nom qualifié : Foo
using Foo<T>::a; int c = a * 4; // Accesses 'a' through namespace resolution
En conclusion, même s'il peut sembler intuitif que Bar hérite de la variable protégée a de Foo, la norme C dicte que cela n'est possible que via une résolution de nom explicite ou des déclarations "using". Cela garantit un comportement cohérent et bien défini dans différentes instanciations de modèles.
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!