7

次のコードでは、コンパイラ エラーが発生します。

'BaseTest::_protMember': クラス 'BaseTest' で宣言された保護されたメンバーにアクセスできません

保護されているにもかかわらず、メンバー変数_protMemberにアクセスできないのはなぜですか?class SubTest

class BaseTest
{
public:
    BaseTest(){};

    BaseTest(int prot)
    {
        _protMember = prot;
    };

protected:
    int _protMember;
};

class SubTest : public BaseTest
{
    // followup question
    SubTest(const SubTest &subTest)
    {
        _protMember = subTest._protMember; // this line compiles without error
    };

    SubTest(const BaseTest &baseTest)
    {
        _protMember = baseTest._protMember; // this line produces the error
    };
};

フォローアップの質問:

追加されたコピー コンストラクターで、別のインスタンスの保護されたメンバーにアクセスできるのはなぜですか?

4

3 に答える 3

6

protectedクラス インスタンス内のメンバーにのみアクセスできます。あれは :

class SubTest : public BaseTest
{
    SubTest(const BaseTest &baseTest)
    {
        _protMember = baseTest._protMember;
     // ^^^^^^^^^^^ Is good because you are in the instance of its class
        _protMember = baseTest._protMember;
     //               ^^^^^^^^^^^^^^^^^^^^^ Produce error because you are not in the baseTest instance.              
    };

    // followup question
    SubTest(const SubTest &subTest)
    {
        _protMember = subTest._protMember;
      // Compile because access modifiers work on class level, and not on object level.
    };
};

フォローアップのために編集:

アクセス修飾子は、オブジェクト レベルではなく、クラス レベルで機能します。

つまり、同じクラスの 2 つのオブジェクトは、互いのプライベート メンバーにアクセスできます。

これは私の情報源です:コピー コンストラクターでプライベート変数にアクセスできるのはなぜですか?

于 2013-07-18T07:27:03.073 に答える
0

_protMemberasを定義するprotectedことにより、派生クラスのオブジェクトが独自の _protMemberにアクセスできるようにします。これは、派生クラスのすべてのオブジェクトが他のオブジェクトにアクセスできるという意味ではありません_protMember

于 2013-07-18T07:25:47.623 に答える