ここで C++ のポイントを理解しようとしています。クラス A に非仮想メソッドがあり、A を拡張するクラス B がそのメソッドをオーバーライドする場合、B のインスタンスを作成して、B で定義されたメソッドを何らかの方法で使用できますか? 非仮想メソッドをオーバーライドするポイントはありますか?
4 に答える
非仮想メソッドをオーバーライドするポイントはありますか?
実際にはオーバーライドしていませんが、これは動作です。
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
することはできませんが、非表示にすることはできます。
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.
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;
}
- いいえ、クラス A の非仮想メソッドをオーバーライドするメカニズムはありません。
- はい、スコープ解決演算子 A::methodName を使用して、B でオーバーロードされたクラス A の非仮想メソッドを使用できます。