Проблема с защищенными полями в базовом классе в С++
-
06-07-2019 - |
Вопрос
У меня есть базовый класс, скажем 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; }
};