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
      }
};

ワーカークラスでファイルをコンパイル中にエラーが発生しました:

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

それ以外の場合はプライベートであり、次のようなエラーが発生します。

「ベース」は「子」のアクセス可能なベースではありません</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を除いて、コードは完全に問題ありません。何も悪いことはありません。タイプミスのために文字通りこれはコンパイルされないので、元のコードはChildfromの派生Baseがプライベートであるか、プライベートであるという点で少し異なっていると思いますgetData

于 2010-10-20T17:59:55.410 に答える
0

コードの現在の既存のバージョンには 継承によるChildサブクラス化があるため、の関数はになり、オブジェクトをBase介してそれらにアクセスすることはできません。protectedpublicBaseprotectedChildWorkerChild

于 2010-10-20T18:10:27.950 に答える
0

クラスはクラスをとしてChild継承するため、のクライアントはメンバー関数にパブリックにアクセスできません。BaseprotectedChild::getData()Child

ここにいる他のみんなが言ったように、 Basetoの継承を変更するpublicことはそれを修正する1つの方法です。

class Child: public Base

Childまた、オブジェクトを型にキャストすると、オブジェクトBaseの関数Base::getData()がパブリックにアクセス可能になることにも注意してください。

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