4

プログラム内の他の場所にある派生クラスのインスタンスから基本クラスのパブリック メンバーにアクセスすることは可能ですか。

class base {
public:
    int x;

    base(int xx){
    x = xx;
    }
};

class derived : base {
public:
    derived(int xx) : base(xx){
    }
};

class main {
public:
    derived * myDerived;      

    void m1(){
        myDerived = new derived(5);
        m2(myDerived);  
    }

    void m2(derived * myDerived){
        printf("%i", myDerived->x);
    }    
};

上記のコードの後、次のエラーが発生しました。

`error: 'int base::x' is inaccessible`
4

6 に答える 6

8

問題は、ここで誤ってプライベート継承を使用することです

class derived : base {

これにより、すべての基底クラス メンバーが派生クラスで非公開になります。

これをに変更

class derived : public base {

期待どおりに動作します。

于 2012-10-31T13:59:51.090 に答える
6

基本クラスからプライベートに継承します。通常必要なのはパブリック継承です。

class derived : public base

プライベート継承に関する FAQはこちらです。

于 2012-10-31T13:59:17.640 に答える
3

その場合は、 public から継承する必要がありbaseます。

class derived : public base {
public:
    derived(int xx) : base(xx){
    }
};

has-aプライベート継承は、2 つのクラス間に関係があり、基本クラスのメンバーをオーバーライドする必要がある場合など、非常に特殊な状況で使用されます。

于 2012-10-31T14:00:05.313 に答える
1

クラスの外部からは、パブリック基本クラスのパブリック メンバーにのみアクセスできます。classキーワードを使用してクラスを定義すると、継承はデフォルトでプライベートになります。

アクセス可能にするには、公開継承が必要です。

class derived : public base
                ^^^^^^
于 2012-10-31T14:00:24.700 に答える
1

試す:

class derived : public base {
    ...
};
于 2012-10-31T14:00:41.730 に答える
0

公開継承を使用します。

class derived : public base {
  ...
};

また

x を公開ではなく非公開にし、次のコードを使用します。

class Base {
        int x;
        public:
            Base (int xx) {
                x = xx;
            }
            void display() {
                cout << "x = " << x << endl;
            }
    };

    class Derived : public Base {
        public:
            Derived (int xx) : Base (xx) {
            }
    };

    int main() {
        Derived d1(2);
        Derived *d = new Derived(10);
        d->display();
        d1.display();
        return 0;
    }
于 2014-02-05T14:09:29.543 に答える