Problème avec les champs protégés dans la classe de base en c ++
-
06-07-2019 - |
Question
J'ai une classe de base, disons BassClass
, avec certains champs, que je les ai protégés, et quelques fonctions virtuelles pures. Ensuite, la classe dérivée, telle que 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 DerivedClass, le compilateur se plaint que DerivedClass ne dispose d'aucun de ces champs. Qu'est-ce qui ne va pas ici?
merci
La solution
Si BassClass
(sic) et DerivedClass
sont des modèles, et le membre BassClass
auquel vous souhaitez accéder à partir de DerivedClass
n'est pas spécifié en tant que nom dépendant, il ne sera pas visible.
ex.
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 y avoir accès, vous devez donner plus d'informations. Par exemple, vous pouvez spécifier complètement le nom du membre:
int get_value() {return BaseClass<T>::value;}
Vous pouvez également préciser que vous faites référence à un membre de la classe:
int get_value() {return this->value;}
Autres conseils
Ceci 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; }
};