2

重複の可能性:
基本クラスで保護された関数を呼び出せませんか?

これをg++でコンパイルします。

class A
{
protected:
    void f(){}
};

class B: public A
{
    void g()
    {
        A a;
        f(); //This works
        a.f(); //Error: "A::F() is protected"
        this->f(); //Works
        ((A*)this)->f(); //Same error
    }
};

基本クラスのthis以外のオブジェクトに対して保護された関数を呼び出すときにエラーが発生します。コンパイラはGCCですが、同じコードが他の種類のGCCでも機能しました。何が起こっているのか、お願いします-基本クラスの保護されたメソッドを呼び出すときは、verbotenそれが経由しない限りthisですか?

編集:申し訳ありませんが、私の悪い。これはすべて仕様によるものです。それが機能した他の場所では、私が気付かなかった友情がありました。投票して終了してください。

4

2 に答える 2

1

インスタンスAから関数f()を呼び出しています。f()はBのプライベート関数であるため、B内から次のように実行できます。

this->f() 

ただし、Aの新しいインスタンスを作成してから、そのf()を呼び出すと、保護されます。

于 2012-12-18T22:09:22.413 に答える
1

fを介してアクセスする必要はありません。thisタイプの任意のオブジェクトからアクセスできますB。たとえば、これは内部で機能しますB::g

B b;
b.f();

C ++ 03標準は(11.5)と言っています:

派生クラスのフレンドまたはメンバー関数が基本クラスの保護された非静的メンバー関数または保護された非静的データメンバーを参照する場合、11項で前述したものに加えて、アクセスチェックが適用されます。 .1)、アクセスは、派生クラス自体(またはそのクラスから派生したクラス)へのポインター、参照、またはオブジェクトを介して行う必要があります

fしたがって、タイプのオブジェクトBまたはから派生したオブジェクトからアクセスできます。これにBは、が含まれますが、これに限定されません*this

C ++ 11標準には、同様の制限が含まれています(11.4)

于 2012-12-18T22:14:06.557 に答える