全部:
当我研究 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;
}
在学习了虚函数之后,我想我明白了多态是如何工作的,但是这段代码中仍然存在一些问题,我不想打扰别人解释这段代码是如何工作的,我只需要一个可以向我展示 Derived 内部细节的人类(不需要太多细节,只显示Vtable中的方法函数指针(或索引)以及那些不是虚拟继承的结构)。
从 pb->h(3.14f); //Base::h(float)3.14(surprise!) 我想应该有几个 vtable,对吗?
谢谢!