一个多态过程的困惑

liuliucy 2009-10-14 04:14:28
小弟我最近看了《深度探索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的类型信息,那又怎么能在编译时实现呢?
...全文
81 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
低头路过 2009-10-14
  • 打赏
  • 举报
回复
楼上的回答该扔板砖。。。
lihan6415151528 2009-10-14
  • 打赏
  • 举报
回复
多态和virtual有关
yshuise 2009-10-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 liuliucy 的回复:]
呵呵,我突然好像有点明白了,参数的时候this指针似乎根本用不着类型信息,我们完全可以只靠指针偏移,因为point中的a , 和point2d中的a, 命名是不一样的 a__point, a__point2d,  这样想就简单多了,看到a__point2d就是偏移8(vptr在对象头上), 这样我又在想lippman 为什么说多态的类型信息(放在了vtable第一个槽呢)是实现多态的副产品呢,或者¡­
[/Quote]
这个类型信息不是为了实现多态,而是相当于一个属性值。有点片像副产品,但是不是。
yshuise 2009-10-14
  • 打赏
  • 举报
回复
为了使多态效率非常高,因为访问某个函数的偏移量是固定的。不会去查表。
liuliucy 2009-10-14
  • 打赏
  • 举报
回复
呵呵,我突然好像有点明白了,参数的时候this指针似乎根本用不着类型信息,我们完全可以只靠指针偏移,因为point中的a , 和point2d中的a, 命名是不一样的 a__point, a__point2d, 这样想就简单多了,看到a__point2d就是偏移8(vptr在对象头上), 这样我又在想lippman 为什么说多态的类型信息(放在了vtable第一个槽呢)是实现多态的副产品呢,或者说类型信息是为了实现多态呢
starcat 2009-10-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 taodm 的回复:]
……还有太多太多更值得学的东西了。
[/Quote]顶!
yshuise 2009-10-14
  • 打赏
  • 举报
回复
this不同代表的是不同的对象。不同的对象内存模型仍然一样,里面的类型信息也是一样。
包括每个虚拟函数的偏移量是固定的(有些会调整)。
taodm 2009-10-14
  • 打赏
  • 举报
回复
先理解多态的功能,再试图理解多态的实现细节。
另外,实现细节是编译器私有的,不可推广的,所以理解了也只是解决纯好奇心,没必要太耗时间在上面,还有太多太多更值得学的东西了。

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧