2

C++ での継承の簡単な例を試しています。しかし、私はそれを下げることができません。Bクラスから継承されたクラスの保護されたメンバーを取得しようとすると、保護されAているA::bazと表示されます。

#include <iostream>

class A {
    public:
        int foo;
        int bar;
    protected:
        int baz;
        int buzz;
    private:
        int privfoo;
        int privbar;
};

class B : protected A {}; // protected members go to class B, right?

int main() {
    B b;

    b.baz; // here is the error [A::baz is protected]
}

私が間違っていることを見つけることができないようです。に変更しようとしclass B : protected Aまし: public Aたが、まだ機能しません。

4

7 に答える 7

5

保護された継承は、クラスのクライアントが基本クラスのパブリックインターフェイスをどのように見るかに影響を与えます。保護された継承は、基本クラスのパブリック メンバーを、継承されたクラスのユーザーに対して保護されているものとしてマークします。

したがってbaz、あなたの例ではパブリックではなく、B から保護されているため、コンパイラ エラーが発生します。

于 2012-08-16T18:01:33.257 に答える
2

外部からではなく、派生クラスの内部protectedからメンバーにアクセスできます。

class B : protected A 
{
   void foo() 
   {
       int x = foo; //ok
       x = baz;     //ok
       x = privfoo; //error
   }
};

継承型は、基本クラスへのアクセスのみを制限します。たとえば、protected継承を選択すると、すべてのpublicメソッドが外部にAなりprotected、残りは同じままです。

于 2012-08-16T18:01:48.573 に答える
0

保護されたフィールドは、それらを宣言するクラス内のメソッド、または宣言するクラスから継承するクラスによってのみアクセスできます。グローバル関数から保護されたフィールドにアクセスしようとしています。

于 2012-08-16T18:01:46.987 に答える
0

A::bazは保護されているため、Bアクセスできます:

class B : public A
{
  public:
    int some_other_method()
    {
        return baz;
    }
};

しかし、それは他のコードがそれにアクセスすることを許可しません。

于 2012-08-16T18:01:53.270 に答える
0

protected アクセス指定子は private に似ています。その唯一の違いは、実際には継承で発生します。クラスが別のクラスから継承する場合、派生クラスのメンバーは、基本クラスから継承された保護されたメンバーにアクセスできますが、そのプライベート メンバーにはアクセスできません。

詳細はこちら

于 2012-08-16T18:02:08.793 に答える
0

メンバーが の場合、そのメンバーprotectedとその子孫を定義するクラスのメソッド内からのみアクセスできます。

あなたがしようとしているのはprotected/private、これらのクラスの外部のコードからメンバーにアクセスすることですが、これは許可されていません。publicクラスのスコープ外からのみクラスのメンバーにアクセスできます。

于 2012-08-16T18:02:10.710 に答える
0

C++ の public/private 継承について読む必要があります。あなたが達成したいことは、置き換えることによって行われます

class B : protected A {};

class B : public A {};

baz編集: 読むのが速すぎて、メインからアクセスしようとしたことに気づきませんでした。メンバーメソッドからのみアクセスできます。

于 2012-08-16T18:02:59.463 に答える