1

特定のプログラムで、クラス B がクラス A を継承し、main() でクラス B のオブジェクトが作成され、getdata() 関数が呼び出されると、クラス B の getdata() が呼び出されるのはなぜですか??

class A {public: void getdata() { cout<<"Class A"; } };

class B: public A { public: void getdata() { cout<<"Class B"; } };

void main() { B b1; b1.getdata(); }
4

3 に答える 3

4

クラス B の getdata() が呼び出されるのはなぜですか??

b1は 型のオブジェクトであるためですB

非メンバー関数は、それらを呼び出す変数の静的型virtualに従って解決されます。

あなたが与えた場合、呼び出す変数getdata()b1であり、タイプはBです。したがって、B::getdata()呼び出されます。

あなたが提供したリンクでは、http://www.tutorialspoint.com/cplusplus/cpp_polymorphism.htmareatype のポインターを介して呼び出される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キーワードを指定すると、これらすべてが変更されます。

于 2012-09-27T18:25:35.107 に答える
2

b1型の変数として静的に宣言されているためですB

この状況ではgetdata()、上記の理由により、仮想ではないという事実は関係ないことに注意してください。

于 2012-09-27T18:25:53.883 に答える
0

C++ オブジェクトは本質的にポリモーフィックではありません (Java とは対照的に)。
ポリモーフィズムを実現するには、「仮想」キーで関数を宣言する必要があります

于 2012-09-27T18:25:45.703 に答える