Problema com campos protegidos em classe base em C ++
-
06-07-2019 - |
Pergunta
Eu tenho uma classe base, dizem BassClass
, com alguns campos, o que eu fiz-los protegidos, e algumas funções virtuais puros. Em seguida, a classe derivada, dizem DerivedClass
, como class DerivedClass : public BassClass
. DerivedClass não deve herdar os campos protegidos de BassClass? Quando eu tentei compilar os DerivedClass, o compilador reclama que DerivedClass não tem nenhum desses campos, o que está errado aqui?
graças
Solução
Se BassClass
(sic) e DerivedClass
são modelos, e o membro BassClass
você deseja acessar a partir DerivedClass
não é especificado como um nome de dependente, não será visível.
por exemplo.
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
};
Para ter acesso é preciso dar mais informações. Por exemplo, você pode especificar totalmente o nome do membro:
int get_value() {return BaseClass<T>::value;}
Ou você pode torná-lo explícito de que você está se referindo a um membro da classe:
int get_value() {return this->value;}
Outras dicas
Isso funciona:
#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; }
};