0

B::Func が静的メソッド呼び出しのように見える構文を使用して A::Func を呼び出すことができるのはなぜですか? インスタンスメソッドだから失敗するんじゃないの?

class A {
public:
    void Func() { 
        printf( "test" );
    }
};

class B : private A {
public:
    void Func() {
        A::Func();  // why does it work? (look below in main())
    }
};

int main() {
    B obj;

    obj.Func();
    // but we cannot write here, because it's not static
    // A::Func();

    return 0;
}
4

1 に答える 1

5

それは「静的に呼び出される」ではありません。これは、呼び出すメンバー関数を明示的に指定するために使用される単なる構文です。仮想であったとしてもFunc、その構文を使用して基本クラス バージョンを呼び出すことができます。

class B : public A {
public:
    void Func() {
        this->A::Func(); /* this-> can be omitted */
    }
};

int main() {
    B obj;
    obj.A::Func();
    return 0;
}

編集:obj.A::Func()あなたの場合、継承はプライベートであるため、実際には無効になるため、それがのベースであるmainことがわかりません。の継承を public に変更して答えを正しくしましたが、関数内ではクラスの外でも機能します。ABBfriend

于 2012-07-25T20:25:44.890 に答える