0
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’
4

6 回答 6

2

你真的把它变成了一个公共基类吗?

//            vvvvvv important
class Child : public Base

否则它是私有的,你会得到类似于你所拥有的错误,即:

'Base' 不是 'Child' 的可访问基础</p>

于 2010-10-20T17:59:56.953 回答
1

这编译:

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();
      }
};
于 2010-10-20T17:58:18.963 回答
0

class Worker 不是clas Worker

Worker类中,obj.setData(val);正在尝试访问Child类的私有成员。

于 2010-10-20T17:56:13.483 回答
0

除了 clas -> class 和 virtua -> virtual 您的代码非常好。它绝对没有错。因为从字面上看,由于拼写错误而无法编译,我怀疑您的原始代码有点不同,因为 from 的派生ChildBase私有的或者getData是私有的。

于 2010-10-20T17:59:55.410 回答
0

由于当前现有版本的代码通过 继承进行了Child子类化,因此in 中的函数无法通过object 访问。BaseprotectedpublicBaseprotectedChildWorkerChild

于 2010-10-20T18:10:27.950 回答
0

Child继承类Baseas protected,因此成员函数Child::getData()对 的客户不可公开访问Child

Base正如这里的其他人所说,更改to的继承public是解决它的一种方法。

class Child: public Base

另请注意,将Child对象转换为类型Base也会使Base::getData()对象的功能可公开访问。

return static_cast<Base *>(&obj)->getData();
于 2010-10-20T18:20:49.563 回答