一个多态过程的困惑
小弟我最近看了《深度探索C++对象模型》,现留下一个困惑的问题,想求助大家。
我知道通常的多态决议像是 (this->vptr)(this),如果扩展成多重继承,像是 (this->vptr__xx[x].addr)(this + this->vptr__xx[x].offset),这里是非自然继承,this地址作了调整,这里扩展了vtable中的slot,如果我只是从内存的角度分析,感觉没什么问题,但当我从C语言的角度考虑如何实现多态的时候,却碰到了问题,主要是指针的类型上。
像下面的例子:
class point{
public:
virtual void fun(){}
int a;
};
class point2d{
virtual void fun(){a = 6;}
int a;
};
void print()
{
point *pt = new point2d;
pt->fun();
delete pt;
}
如果那条多态翻译成C语句 ((point *)pt->vptr[1])(this); 如果是书上都会写(this->vptr[1])(this);我从C的角度看((point *)pt->vptr[1]) 得到vtable中的地址是没问题的,毕竟数据没有多态,vptr的位置已在编译时固定,在这里基类和派生类的vptr地址的偏移是相同的,问题是参数中this的类型,编译器如何得到,我知道在vtable的第0个slot中放置了type 信息,但那要等到运行时才能取得,我查看了汇编代码,a = 6 被转化为mov eax,dword ptr [this] mov dword ptr [eax+8],6 ,显然这里在编译时this指针已经被传化为point2d类型指针了,那这个类型信息,怎么得来的呢,怎么看待这个this指针呢,如果this指针本身带着确切的类型信息,那就没必要多态支持了,如果它想取得vtable中第0个slot的类型信息,那又怎么能在编译时实现呢?