Проблема с защищенными полями в базовом классе в C ++ - PullRequest
5 голосов
/ 28 ноября 2009

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

Ответы [ 2 ]

9 голосов
/ 28 ноября 2009

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

1007 * Е.Г. *

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;}
0 голосов
/ 29 ноября 2009

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

#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; }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...