16

ここで C++ のポイントを理解しようとしています。クラス A に非仮想メソッドがあり、A を拡張するクラス B がそのメソッドをオーバーライドする場合、B のインスタンスを作成して、B で定義されたメソッドを何らかの方法で使用できますか? 非仮想メソッドをオーバーライドするポイントはありますか?

4

4 に答える 4

38

非仮想メソッドをオーバーライドするポイントはありますか?

実際にはオーバーライドしていませんが、これは動作です。

B* b = new B();
A* a = new B();
b->method(); //Calls B's method
a->method(); // Calls A's method

したがって、ポインター/参照型によって、呼び出されるメソッドが決まります。

B のインスタンスを作成し、B で定義されたメソッドを何らかの方法で使用できますか?

はい。ポインター/参照型は B 型である必要があります (前の例を参照)。

であると宣言methodしない場合、それをオーバーライドvirtualすることはできませんが、非表示にすることはできます。

于 2012-06-29T22:18:42.067 に答える
13

If B inherits from A, and redefines a method defined in A, then new instances of B will call B's version. However, if the method is not virtual, then there is no polymorphic behavior, so if an instance of B is referenced as an A, then the method will be A's. For example:

struct A {
    void foo () { std::cout << "A::foo" << std::endl; }
};

struct B : public A {
    void foo () { std::cout << "B::foo" << std::endl; }
};

B b;
b.foo();
A *a = &b;
a->foo();

The output of the code above would be:

B::foo
A::foo

However, if the foo method had been virtual, then B::foo would have been printed twice.

于 2012-06-29T22:06:27.260 に答える
4

If a function is not virtual then the type of the variable determines which implementation is dispatched too:

#include <iostream>

using namespace std;

struct A {
    void f() { cout << "A" << endl; }
};

struct B : public A {
    void f() { cout << "B" << endl; }
};

int main(int args, char** argv) {

    B b;
    A& a = b;

    b.f();
    a.f();

    return 0;
}
于 2012-06-29T22:06:57.070 に答える
0
  • いいえ、クラス A の非仮想メソッドをオーバーライドするメカニズムはありません。
  • はい、スコープ解決演算子 A::methodName を使用して、B でオーバーロードされたクラス A の非仮想メソッドを使用できます。
于 2012-06-29T22:10:53.320 に答える