全て:
C++ でポリモーフィズムを研究していると、ここに小さな例が見つかります。
#include <iostream>
using namespace std;
class Base{
public:
virtual void f(float x){cout<<"Base::f(float)"<<x<<endl;}
void g(float x){cout<<"Base::g(float)"<<x<<endl;}
void h(float x){cout<<"Base::h(float)"<<x<<endl;}
};
class Derived:public Base{
public:
virtual void f(float x){cout<<"Derived::f(float)"<<x<<endl;}
void g(int x){cout<<"Derived::g(int)"<<x<<endl;}
void h(float x){cout<<"Derived::h(float)"<<x<<endl;}
};
int main(void){
Derived d;
Base *pb=&d;
Derived *pd=&d;
//Good:behavior depends solely on type of the object
pb->f(3.14f); //Derived::f(float)3.14
pd->f(3.14f); //Derived::f(float)3.14
//Bad:behavior depends on type of the pointer
pb->g(3.14f); //Base::g(float)3.14
pd->g(3.14f); //Derived::g(int)3(surprise!)
//Bad:behavior depends on type of the pointer
pb->h(3.14f); //Base::h(float)3.14(surprise!)
pd->h(3.14f); //Derived::h(float)3.14
return 0;
}
仮想関数を研究した後、ポリモーフがどのように機能するかを理解したと思いますが、このコードにはまだいくつかの疑問があります。このコードがどのように機能するかを誰かに説明してほしくありません。クラス(詳細は必要ありません。Vtableに配置されたメソッド関数ポインター(またはインデックス)とそれらの構造が仮想継承されたものではないことを示すだけです)。
pb->h(3.14f) から; //Base::h(float)3.14(驚き!) 複数の vtable が必要だと思いますが、そうですか?
ありがとう!