クラス B の getdata() が呼び出されるのはなぜですか??
b1
は 型のオブジェクトであるためですB
。
非メンバー関数は、それらを呼び出す変数の静的型virtual
に従って解決されます。
あなたが与えた場合、呼び出す変数getdata()
はb1
であり、タイプはB
です。したがって、B::getdata()
呼び出されます。
あなたが提供したリンクでは、http://www.tutorialspoint.com/cplusplus/cpp_polymorphism.htmがarea
type のポインターを介して呼び出されるShape*
ため、Shape::area()
呼び出されます。
このプログラムも検討してください: http://ideone.com/KVjN3
#include <iostream>
class A {public: void getdata() { std::cout<<"Class A\n"; } };
class B: public A { public: void getdata() { std::cout<<"Class B\n"; } };
int main() { B b1; b1.getdata(); A* pa = &b1; pa->getdata(); }
出力:
Class B
Class A
それはあなたのプログラムに非常に似ています。の最初の呼び出しgetdata()
は を介して行われるB
ため、B::getdata()
が呼び出されます。2 番目は を介して行われるA*
ため、A::getdata()
が呼び出されます。
ただし、virtual
キーワードを指定すると、これらすべてが変更されます。