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

Foi útil?

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; }
};
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top