Pregunta

Tengo una clase base, digamos BassClass , con algunos campos, que los protegí, y algunas funciones virtuales puras. Luego, la clase derivada, digamos DerivedClass , como class DerivedClass: public BassClass . ¿No debería DerivedClass heredar los campos protegidos de BassClass? Cuando intenté compilar DerivedClass, el compilador se queja de que DerivedClass NO tiene ninguno de esos campos, ¿qué hay de malo aquí? gracias

¿Fue útil?

Solución

Si BassClass (sic) y DerivedClass son plantillas, y el miembro BassClass al que desea acceder desde DerivedClass no se especifica como un nombre dependiente, no será visible.

Por ejemplo

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 obtener acceso necesita dar más información. Por ejemplo, puede especificar completamente el nombre del miembro:

    int get_value() {return BaseClass<T>::value;}

O puede hacer explícito que se refiere a un miembro de la clase:

    int get_value() {return this->value;}

Otros consejos

Esto 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top