2009-11-28 13 views
4

J'ai une classe de base, disons BassClass, avec quelques champs, dont je les ai protégés, et quelques fonctions virtuelles pures. Puis la classe dérivée, disons DerivedClass, comme class DerivedClass : public BassClass. DerivedClass ne devrait-il pas hériter des champs protégés de BassClass? Lorsque j'ai essayé de compiler le DerivedClass, le compilateur se plaint que DerivedClass n'a aucun de ces champs, qu'est-ce qui ne va pas ici? grâceProblème avec les champs protégés dans la classe de base en C++

+3

plzsendthecodez – int3

+4

ouais ce que vous décrivez ressemble à ça devrait fonctionner. Cela se résume probablement à la façon dont votre code est écrit. Donnez-nous un exemple de base qui recrée l'erreur de votre compilateur, alors nous pouvons vous aider. –

+0

Est-ce que vous héritez d'un cours modélisé? Si c'est le cas, vous devez utiliser this-> lors de l'accès aux variables membres de la classe de base. –

Répondre

8

Si BassClass (sic) et DerivedClass sont des modèles, et le membre BassClass que vous souhaitez accéder à partir DerivedClass n'est spécifié comme un nom à charge, il ne sera pas visible.

E.g.

template <typename T> class BaseClass { 
protected: 
    int value; 
}; 

template <typename T> class DerivedClass : public BaseClass<T> { 
public: 
    int get_value() {return value;} // ERROR: value is not a dependent name 
}; 

Pour accéder, vous devez donner plus d'informations. Par exemple, vous pourriez bien préciser le nom du membre:

int get_value() {return BaseClass<T>::value;} 

Ou vous pourriez le rendre explicite que vous faites référence à un membre de la classe:

int get_value() {return this->value;} 
+5

La raison de ce comportement de modèle est que, au moment où le modèle DerivedClass est défini, le compilateur n'a aucun moyen de savoir si 'BaseClass 'va avoir un membre' value' ou non. Vous pourriez vous spécialiser en retard sur 'BaseClass ' pour qu'il n'en ait pas, et ensuite essayer d'instancier 'DerivedClass '. La définition du modèle est donc censée être rejetée. En ajoutant les informations supplémentaires que vous dites "c'est OK, ce que' value' dépend de 'T', alors ne vous attendez pas à le trouver". –

+2

Alternativement, nous pouvons faire 'en utilisant BaseClass :: value;' dans la déclaration de classe dérivée, ce qui permettrait au reste de la classe dérivée d'appeler simplement 'value'. – int3

0

Cela fonctionne:

#include <iostream> 

struct Base { 
virtual void print() const = 0; 
protected: 
int val; 
}; 

struct Derived : Base { 
void print() { std::cout << "Bases's val: " << val << std::endl; } 
};