代码之家  ›  专栏  ›  技术社区  ›  Max Frai

派生类函数

  •  0
  • Max Frai  · 技术社区  · 15 年前
    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’
    
    6 回复  |  直到 15 年前
        1
  •  2
  •   GManNickG    15 年前

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

    //            vvvvvv important
    class Child : public Base
    

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

    基不是子级的可访问基

        2
  •  1
  •   Donotalo    15 年前

    编译:

    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();
          }
    };
    
        3
  •  0
  •   Armen Tsirunyan    15 年前

    除了clas->class和virtua->virtual之外,您的代码非常好。完全没有问题。因为从字面上看,这并不是因为拼写错误而编译的,所以我怀疑您的原始代码与 Child Base 是私人的还是那个 getData 是私人的

        4
  •  0
  •   dgnorton    15 年前

    class Worker clas Worker

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

        5
  •  0
  •   wkl    15 年前

    因为代码的当前现有版本 Child 子类化 Base 通过 protected 继承权 public 功能在 基地 成为 受保护的 在里面 孩子 如此 Worker 无法通过访问它们 孩子 对象。

        6
  •  0
  •   David R Tribble    15 年前

    等级 Child 继承类 Base 作为 protected ,所以成员函数 Child::getData() 的客户端无法公开访问 孩子 .

    正如这里所有人所说,改变 基地 public 是解决问题的一种方法。

    class Child: public Base
    

    还要注意,铸造 孩子 对象类型 基地 也使功能 Base::getData() 公开访问的对象。

    return static_cast<Base *>(&obj)->getData();
    
    推荐文章