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 ?

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 ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-02 05:55:11216parcourir

How Can a Templated Class Inherit and Access Protected Members from its Dependent Base Class?

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::a. Alternativement, une déclaration "using" peut être utilisée dans Bar :

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!

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