派生类功能

时间:2010-10-20 17:54:13

标签: c++ class inheritance derived

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 个答案:

答案 0 :(得分:2)

你真的让它成为公共基类吗?

//            vvvvvv important
class Child : public Base

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

  

'Base'不是'Child'的可访问基础

答案 1 :(得分: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();
      }
};

答案 2 :(得分:0)

class Worker不是clas Worker

Worker班级中,obj.setData(val);正在尝试访问Child班级的私人会员。

答案 3 :(得分:0)

除了clas - &gt; class and virtua - &gt;虚拟你的代码完全没问题。这绝对没有错。因为字面意思由于拼写错误而无法编译,所以我怀疑您的原始代码有点不同,因为ChildBase的派生是私有的,或者getData是私有的。

答案 4 :(得分:0)

由于当前现有版本的代码Child通过Base继承protected进行了子类化,public中的Base函数变为protectedChild中,Worker无法通过Child对象访问它们。

答案 5 :(得分:0)

Child将类Base作为protected继承,因此Child::getData()的客户端无法公开访问成员函数Child

正如其他所有人所说,将Base的继承更改为public是解决此问题的一种方法。

class Child: public Base

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

return static_cast<Base *>(&obj)->getData();