1

以下のコード ( ) によって生成される出力には驚きましたg++ 4.4.7

class A {
public:
    virtual void f() {std::cout << "A::f()" << std::endl;}
};

class B : public A {
private:
    // Automatically virtual, because of base class
    void f() {std::cout << "B::f()" << std::endl;}
};

int main(int argc, const char *argv[])
{
    A *pB = new B();
    pB->f();
    return 0;
}

出力は

B::f()

バインディングが遅いため、コンパイラがここでエラーを発行できないことはわかっていますが、非プライベート コンテキストからプライベート メソッドを呼び出せるのはなぜでしょうか?

根拠は何ですか?

4

3 に答える 3

0


実際、プライベート セクションで基本クラスの仮想関数を指定するように少し変更してこのコードを実行しようとしましたが、コンパイラからエラーが発生しました。コンパイル
時に最初の制御は基本クラス関数に移動しますが、それはプライベートセクションで定義されているため、
コンパイラはエラーをスローします。
基本クラスの参照を取得する派生クラスのオブジェクトを宣言するときはいつでも。コンパイル時に制御が最初に基底クラスに行き、すべてのクラスが独自の仮想テーブルを作成し、実行時にポインター オブジェクトが派生クラス関数を呼び出します。前述のように、プライベートまたはパブリックとして宣言されている場所は関係ありません。

   class A {
         virtual void f() {std::cout << "A::f()" << std::endl;}
  };

class B : public A {
   private:
     // Automatically virtual, because of base class
      void f() {std::cout << "B::f()" << std::endl;}
 };

int main(int argc, const char *argv[])
 {
  A *pB = new B();
   pB->f();
 return 0;
}
于 2013-10-18T12:11:26.503 に答える