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

Était-ce utile?

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; }
};
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top