Производная функция класса - PullRequest
0 голосов
/ 20 октября 2010
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
      }
};

Ошибка при компиляции файла с классом Worker:

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’

Ответы [ 6 ]

2 голосов
/ 20 октября 2010

Вы действительно сделали это общедоступным базовым классом?

//            vvvvvv important
class Child : public Base

В противном случае это конфиденциально, и вы получите ошибки, аналогичные тем, которые у вас есть, а именно:

«База» не является доступной базой «Ребенка»

1 голос
/ 20 октября 2010

Это компилируется:

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();
      }
};
0 голосов
/ 20 октября 2010

Класс Child наследует класс Base как protected, поэтому функция-член Child::getData() не является общедоступной для клиентов Child.

Как все остальные здесь говорили, изменение наследованияот Base до public - это один из способов исправить это.

class Child: public Base

Также обратите внимание, что приведение вашего Child объекта к типу Base также делает функцию Base::getData() объекта общедоступной.

return static_cast<Base *>(&obj)->getData();
0 голосов
/ 20 октября 2010

Поскольку текущая существующая версия кода имеет Child подклассы Base через protected наследование, функции public в Base становятся protected в Child, поэтому Worker не может получить доступ их через Child объект.

0 голосов
/ 20 октября 2010

За исключением clas -> class и virtua -> virtual, ваш код отлично работает. В этом нет абсолютно ничего плохого. Поскольку буквально это не компилируется из-за опечаток, я подозреваю, что ваш исходный код немного отличался тем, что вывод Child из Base был закрытым или getData был закрытым.

0 голосов
/ 20 октября 2010

class Worker не clas Worker

В Worker классе obj.setData(val); пытается получить доступ к закрытому члену Child класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...