-2

さて、多くのポリモーフィズム スレッドが飛び交っていることはわかっていますが、まだこのような状況に遭遇したことはありません。

class Base {
public:
    virtual void method1() {
        cout << "BaseMethod1" << endl;
    }

    void method2() {
        cout << "BaseMethod2" << endl;
    }
};

class Derive: public Base {
public:
    void method1() {
        cout << "DeriveMethod1" << endl;
        method2();
    }

    void method2() {
        cout << "DeriveMethod2" << endl;
    }
};

int main() {
    Base* p = new Derive();
    p->method1();
}

私をつまずかせているのは、派生クラスのメソッド1がメソッド2を呼び出すことです。Base クラスの method2 は virtual として宣言されていないため、どの method2 になるのでしょうか?

お早めにどうぞ!

4

3 に答える 3

4

Base::method1()が宣言されているため、問題のコードはコンパイルされませんprivatepublicから呼び出せるようにする必要がありますmain


Derived::method1()virtualとしてマークされていなくても、暗黙的にvirtualです。したがって、thisinはオブジェクトをDerived::method1()指しDervied、このスコープではコンパイラは のみを見ることができますDerived::method2()。したがってDerived::method2()、呼び出されます。派生クラスのメソッドは、基本クラスの同じ名前のメソッドを隠します。


よく読んだ:

警告: Derived::f(char) hides Base::f(double) の意味は何ですか?

于 2013-03-01T04:55:41.160 に答える
2

このパターンがあまり見られない主な理由は、実際にはアンチパターンであるためです。

Derived オブジェクト参照 (this) を使用して呼び出しているため、Derived メソッドが呼び出されます。Base クラス参照で呼び出していた場合は、Base メソッドを取得します。

非仮想メソッドを再宣言すると、基本メソッドが隠され、ポリモーフィズムが壊れます。

于 2013-03-01T04:59:48.537 に答える
1

クラス自体から始まるDerive::method2()名前ルックアップ (の本体) として使用されます。Derive::method1()

于 2013-03-01T04:59:05.940 に答える