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++
Répondre
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;}
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
Alternativement, nous pouvons faire 'en utilisant BaseClass
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; }
};
plzsendthecodez – int3
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. –
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. –