Проблема с защищенными полями в базовом классе в С++

StackOverflow https://stackoverflow.com/questions/1813671

Вопрос

У меня есть базовый класс, скажем BassClass, с некоторыми полями, которые я сделал защищенными, и некоторыми чисто виртуальными функциями.Тогда производный класс, скажем DerivedClass, нравиться class DerivedClass : public BassClass.Разве DerivedClass не должен наследовать защищенные поля от BassClass?Когда я попытался скомпилировать DerivedClass, компилятор жалуется, что DerivedClass НЕ имеет ни одного из этих полей. Что здесь не так?Спасибо

Это было полезно?

Решение

Если BassClass (так в оригинале) и DerivedClass представляют собой шаблоны, а BassClass участник, к которому вы хотите получить доступ DerivedClass не указано как зависимое имя, оно не будет видно.

Например.

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
};

Для получения доступа вам необходимо предоставить дополнительную информацию.Например, вы можете полностью указать имя участника:

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

Или вы можете явно указать, что имеете в виду члена класса:

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

Другие советы

Это работает:

#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; }
};
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top