****SOS***神啊救救我吧,怎么想了老久都想不通啊50分基分答好番翻,
前提:我知道实际上基类和其派生类的VPTR是相同的,即他们存放VPTR的地址是同一个。但按这个原理的话下面的程序我有点不懂。
#include<iostream>
using namespace std;
//------------------------------------------------------------
class Base
{
....
virtual fun(){cout<<"this is Base:: fun();}
};
//----------------------------------------------------------------
class Derive:public Base
{
...
virtual fun(){cout<<"this is Derive::fun();}
};
//-------------------------------------------------------------------
int main
{
Base *pd=new Derive();//当程序运行到这行时,Derive的构造函数将把VPTR初始化为指向Derive的VTABLE首地址,
Base *pb=new Base();//而当程序运行到这行时,Base的构造函数又将把VPTR初始化为指向Base的VTABLE首地址,这是VPTR的值不在是上面那个指向Derive的VTABLE首地址。
pd->fun();//因此调用这行时,pd查找vptr时会得到指向Base的vtable的首地址,那么它将调用Base下的fun();
return 0;
}
//我知道事实上执行的结果不是这样的,但是我不知道我的推理上哪出了问题,但是可以肯定的是我的前提没错,就是实际上基类和其派生类的VPTR是相同的,即他们存放VPTR的地址是同一个,但各个类却有不同的vtable.
谁能渗透的帮我讲讲。