2017-11-04 4 views
0

公開クラスを継承する派生クラスのメソッドから基本クラスの保護されたメンバーにアクセスしようとするとエラーが発生します。公開派生クラスから保護されたメンバーにアクセス

基本クラスの2つのオブジェクトを派生クラスのメソッドに渡して、オブジェクトの保護されたメンバーにアクセスしようとしています。しかし、編集者は不平を言う。

int A::x 
protected member A::x (declared at line 5) is not accessible though "A" pointer or object. 

私のコードの何が問題であると私は何を行うことができます。

class A { 
protected: 
    int x; 
}; 

class B:public A 
{ 
public: 
    void test(A &obj1, A &obj2) 
    { 
    obj1.x = 1; 
    obj2.x = 2; 
    } 
}; 

そしてthisをエディタから文句れる:ソートで

は、ここで私が何をしようとしていますものですそれを修正するには?

ありがとうございます。

+0

コピーして、エラーメッセージを貼り付け、彼らのために外部のリンクや画像を使用しないでください。コンパイルしようとすると、コンパイラは同じメッセージを表示しやすくなります。 – aschepler

+0

私はバッジが足りないので、イメージをまだアップロードできません。代わりに、エラーが書き込まれたリンクが自動的に作成されました。 – ginos

+1

'x'に' B'オブジェクトでアクセスできますが、 'A'オブジェクトではアクセスできません。 – DimChtz

答えて

1

派生オブジェクトと同じタイプのクラスの保護された基本クラスにのみアクセスできます。メンバーまたはその他の回避策を入手するには、公開方法を作成する必要があります。 Aをプライベートとして継承した別のクラスCがあるとします。 CのメソッドをA参照として渡すことはできますが、基本クラスのメンバーはアクセスできません。参照がBが参照するBメソッドに渡された場合、その中の保護されたメンバーにアクセスすることができます。

+1

アクセスは「this」を特に通過する必要はありませんが、派生型のオブジェクトを介して – aschepler

+0

私はそれを修正しました、ありがとう。 –

0

クラスAの場合、変数xは保護されており、クラスAのプライベートのように動作するため、メンバ変数A :: Xにはアクセスできません。あなたは

void test(B &obj1, B &obj2) 

に方法

void test(A &obj1, A &obj2) 

を変更した場合、継承が公開されているとして保護として

しかし、その後、あなたはその可能として、クラスBから変数xにアクセスすることができます。だから、

クラスBのXをアクセスするために、次のように、全体のコードを書くことができます。

class A { 
    protected: 
     int x; 
}; 

class B:public A 
{ 
    public: 
     void test(B &obj1, B &obj2) 
     { 
      obj1.x = 1; 
      obj2.x = 2; 
     } 
}; 
関連する問題