15
#include<iostream>
using namespace std;
class uvw;
class abc{
   private:
      int privateMember;
   protected:
    int protMember;
   public:
    int publicMember;
};

class def : private abc{
    public:
       void dummy_fn();
};

class uvw: public def{

};

void def::dummy_fn()
{
   abc x;
   def y;
   uvw z;
   cout << z.protMember << endl; // This can be accessed and doesn't give a compile-error
}

私が理解していることdefから、 は から非公開で継承されabc、で非公開protMemberpublicMemberなりdefます。したがって、 がuvwから継承された場合def、データ メンバーを持たないようにする必要があります。しかし、奇妙なことに、そもそもasが変数を持つべきではないz.protMemberからアクセスできます。私はどこか間違っていますか?dummy_fn()zprotMember

4

3 に答える 3

6

無料の関数からアクセスしようとしても、うまくいきません。この場合、dummy_fn()は のメンバ関数でdefあるため機能します。そのため、 内のすべてのプライベートなものにアクセスできますdefz is-a であるため、インスタンス内のdefプライベートdefメンバーにもアクセスできます。z

または、少なくともそれは私の推測です。変なケースです。

于 2013-11-08T08:26:55.740 に答える
2

プライベート継承は、クラス外からのアクセスのみを制限します。派生クラスが基本クラスから見るものを制限しません。したがって、あなたの場合、 where はdefから非公開で継承されabcdefの保護されたすべてのメンバーに引き続きアクセスできますabc。のクライアントだけdefが、 からの何にもアクセスできませんabc。でさえありませんpublicMember

また、非公開継承とメンバーを継承しないことなどを混同しないでください。

そのため、uvw が def から継承する場合、データ メンバーを持たないようにする必要があります。

この声明は真実ではありません。 とuvw持っているデータメンバーがあるだけでなく、外部からアクセスすることはできません。abcdef

詳細については、たとえばこちらを参照してください: http://www.learncpp.com/cpp-tutorial/115-inheritance-and-access-specifiers/

于 2013-11-08T09:44:51.030 に答える