2009-06-08 11 views
11

私はしばらくC++を行っていないと次が動作しない理由を把握することはできません。派生クラスのインスタンスから保護されたメンバーにアクセスできないのはなぜですか?

これが生成するコンパイル
class A { 
protected: 
    int num; 
}; 

class B : public A { 
}; 

main() { 
    B * bclass = new B(); 
    bclass->num = 1; 
} 

エラーC2248: ':: numは' :クラス 'A'で宣言された保護されたメンバにアクセスできない

保護されたメンバーは派生クラスからアクセスできないようにしてください。

私には何が欠けていますか?

答えて

31

はい保護されたメンバーは派生クラスからアクセスできますが、階層外のmain()関数でアクセスしています。あなたがクラスBとアクセスnumでメソッドを宣言すればそれは問題ありません。

+0

ありがとうございました!私は今私の間違いを見る –

13

はい、保護されたメンバーは派生クラスからアクセスできますが、クラス内からのみアクセスできます。

例:

#include <iostream> 

class A { 
    protected: 
    int num; 
}; 

class B : public A { public: 
    void printNum(){ 
     std::cout << num << std::endl; 
    } 

}; 

main() { 
    B * bclass = new B(); 
    bclass->printNum(); 
} 

numの値を出力しますが、numクラスB内からアクセスされます。 numは、bclass->numとしてアクセスできるようにpublicと宣言する必要があります。

8

Bの機能の範囲内でアクセスできますが、メインでアクセスしようとしています。

6

しかし、あなたは派生クラスからアクセスしていません。 main()からアクセスしています。

3

"保護された"とは、メンバ関数または派生クラスのメンバ関数の外部からのアクセスから保護されていることを意味します。 "main"関数はどちらのクラスのメンバーでもありませんが、メンバー変数に直接アクセスしようとしています。

4

クラスを利用する場合、保護されたメンバーとプライベートメンバーの間に違いはありません。クラスを利用するものにはアクセスできません。

class A { 
    private: int privateNum; 

    protected: int protectedNum; 

    public: int publicNum; 

    void SetNumbers(int num) { 
     privateNum = num; //valid, private member can be accessed in member function 
     protectedNum = num; //valid, protected member can be accessed in member function 
} 

void main() { 
    A classA; 
    classA.privateNum = 1; //compile error can't access private member 
    classA.protectedNum = 1; //compile error can't access protected member 
    classA.publicNum = 1; //this is OK 
    classA.SetNumbers(1); //this sets the members not accessible directly 
} 

この相違点は、保護されたメンバーを持つクラスから継承すると有効になります。

class B : public A { 
} 

基本クラスのプライベートメンバーはすべてプライベートであり、派生クラスからアクセスできません。一方、保護されたメンバは、継承されたクラスからアクセスできますが、引き続き継承されたクラスの外部からはアクセスできません。

class B : public A { 
public: 
    void SetBNumbers(int num) { 
     privateNum = num; //compile error, privateNum can only be accessed by members of A, not B 
     protectedNum = num; //this works, as protected members can be accessed by A and B 
    } 
} 

void main() { 
    B classB; 
    classB.publicNum = 1; //valid, inherited public is still public 
    classB.protectedNum = 1; //compile error, can't access protected member 
    classB.privateNum = 1; //compile error, B doesn't know that privateNum exists 
    classB.SetBNumbers(1); //this sets the members not accessible directly 
} 
0

はい、あなたは派生呼び出しで関数を作成することにより、メインで保護されたデータメンバにアクセスすることができ、メインfunction.Butで保護されたデータメンバにアクセスすることはできません。

+0

この質問には十分な答えがありますか? – matsjoyce

関連する問題