Вопрос

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