Полученная функция класса
-
09-10-2019 - |
Вопрос
class Base
{
protected:
int data;
public:
virtual int getData() { return data; }
virtual void setData(int value) { data = value; }
};
class Child : protected Base
{
public:
void setData(int value)
{
Base::setData(value);
cout << "Data is set.\n";
}
};
class Worker
{
private:
Child obj;
public:
void setGlobalData(int val)
{
obj.setData(val); // This is normal
}
int getGlobalData()
{
return obj.getData(); // Line 140, Error
}
};
Ошибка во время составления файла с классом работника:
Base.hpp: In member function ‘int Worker::getGlobalData()’:
Base.hpp:22:19: error: ‘virtual int Base::getData()’ is inaccessible
Worker.cpp:140:34: error: within this context
Worker.cpp:140:34: error: ‘Base’ is not an accessible base of ‘Child’
Решение
Вы действительно сделали это общественным базовым классом?
// vvvvvv important
class Child : public Base
В противном случае это приватно, и вы получаете ошибки, похожие на то, что у вас есть, а именно:
«База» не является доступной базой «ребенка»
Другие советы
Это компилируется:
class Base
{
protected:
int data;
public:
virtual int getData() {return data;}
virtual void setData(int value) { data = value; }
};
class Child : public Base
{
public:
void setData(int value)
{
Base::setData(value);
cout << "Data is set.\n";
}
};
class Worker
{
private:
Child obj;
public:
void setGlobalData(int val)
{
obj.setData(val); // This is normal
}
int getGlobalData()
{
return obj.getData();
}
};
За исключением CLAS -> Class и Virtua -> Virtual ваш код вполне хорош. В этом нет ничего плохого. Поскольку буквально это не компилируется из -за опечаток, я подозреваю Child
от Base
был частным или что getData
был частным.
class Worker
нет clas Worker
В Worker
класс, obj.setData(val);
пытается получить доступ к частному члену Child
класс.
Поскольку текущая существующая версия кода имеет Child
подкласс Base
через protected
наследство, public
функции в Base
стали protected
в Child
, так Worker
не могу получить к ним доступ через Child
объект.
Класс Child
наследует класс Base
в виде protected
, Итак, функция участника Child::getData()
Обычно не доступен клиентам Child
.
Как говорили все остальные, изменяя наследство Base
к public
это один из способов исправить это.
class Child: public Base
Также обратите внимание, что нанесение вашего Child
объект на тип Base
также делает функцию Base::getData()
объекта общедоступным.
return static_cast<Base *>(&obj)->getData();