请详解C++中多态实现的内部原理!!!

seduces 2005-04-10 10:31:48
在C++中,到底是怎样实现多态功能的,请各位详解!!!
...全文
458 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
qqfig 2005-04-11
  • 打赏
  • 举报
回复
呵呵,
就像楼上说,在C++的编译过程中,类的存储就大体是一个结构体(几去掉成员函数),作为一个完整的封装类型,这其中,指针起到了举足轻重的作用。
比如class b
{
int a;
virtual fun1();
void fun2();
}
在编译后的结构形式大体为
vtable 4字节
int a 4字节
vtable 的作用就是为多态准备的,它是编译后虚表指针所指向的一张表(虚函数的地址表),也就是说有表的项数就为虚函数的个数,每继承一种新的类,就要为其重写了的虚函数重写他的虚表,没有重写的就直接指向其父类的地址,从而达到多态的作用,这些都是在编译的时候由编译器自动完成的。
也许你要问fun2的地址怎么不用存储了,是的,它直接就可以在编译的时候用其函数指针确定;
编译器直接可以翻译成;CALL fun2的地址。
jingyueid 2005-04-11
  • 打赏
  • 举报
回复
多态,其实就是函数指针的灵活运行。

首先你要知道什么叫继承,继承在内存中就是:class B : public A ==> class B inlucde class A,B的内存中的开始部分是A,当你多继承的时候,也就是第一个项,这就是为什么你强制类型转换后,还能继续访问基类的原因,什么都没有变,只不过使用了类型标志,限定了长度而已。

函数(普通函数,非虚)都是存在在类型上的,可以这样去理解:就是函数在类型的命名空间里,因此你的程序被编译后永远都是安装顺序一步一步走的,所以任何时间都最多只能有一个实例来访问类型的方法,C++中,这个东西就被叫做this。

但虚函数呢,其实也是存储在类型上的,但如果这样的话,多态就出8来了。虚函数将会被委派一个函数指针,也就是通常说的的vtable的指针,这个指针是作为一个数据成员出现的,虽然所有从一个类得到的实例都一样,但还是要有一个指针,毕竟嘛,指针只有四个字节长度那么大。

这样vtable是作为类型的第一个被定义的,只有这样在类型被上塑的时候才不会丢失vtable信息,并且一个类只有一个vtable,这样的话,继承后的类的vtable一般都和父类的vtable不一样,当你调用虚方法的时候,其实就调用了真正内存结构的里的vtable所指的方法。

所以:你的对象上溯的时候类型信息并没有丢失,你简直就可以这样理解,当你使用了虚方法,并且有不同的实现体时,类里面已经定义了一个标志变量,来帮你标志实际的类型。而实际上,C++的效果也正是这样的。
healer_kx 2005-04-11
  • 打赏
  • 举报
回复
虚表, 你需要知道对象的内存结构,。还是挺简单的。
whyglinux 2005-04-11
  • 打赏
  • 举报
回复
在C++中,多态实现的方式有这么几种:运算符重载、函数重载、模板、动态绑定(虚函数成员)。参考一般的C++书籍即可。
zengwujun 2005-04-11
  • 打赏
  • 举报
回复
mark
searoom 2005-04-11
  • 打赏
  • 举报
回复
有个虚拟函数表
kobefly 2005-04-11
  • 打赏
  • 举报
回复
多态的实现

主要还是通过vtable表来实现的

具体的,你要自己看书啊
xjp6688 2005-04-11
  • 打赏
  • 举报
回复
虚函数表
seduces 2005-04-11
  • 打赏
  • 举报
回复
呵呵,多谢各位!!!
ewayne 2005-04-11
  • 打赏
  • 举报
回复
主要是就是虚拟函数的问题!
astrophor 2005-04-11
  • 打赏
  • 举报
回复
<<Inside the C++ Object Model>>中有详细讲解
大致就是每个包含虚函数,或者是继承的类中都有个vptr,指向一个vtable
vtable里包含了各个虚函数的实现,编译器判断后自动给vptr指向一个函数
具体的看书了
oyljerry 2005-04-11
  • 打赏
  • 举报
回复
通过vtable来动态确定
MagicCarmack 2005-04-11
  • 打赏
  • 举报
回复
我也去学学
liujinxing 2005-04-10
  • 打赏
  • 举报
回复
直接看看书呀!!!
ljq14 2005-04-10
  • 打赏
  • 举报
回复
通过虚函数吧,在有继承关系的类中,如果父类中有虚函数,则在每个类中都隐式有个虚函数的指针指向虚函数表,在本类型的指针调用此函数时,根据此指针进行必要的选择(编译器实现),这样就实现了多态性.
但是这又必然带来一系列的问题,如果不按标准使用,有时会产生很多解释不了的错误,最好要严格按标准使用.
这里不详述,可参考楼上兄弟的<<Inside the C++ Object Model>>或编程原理之类的书~~
请指教~~~~~~~~
chunhai12 2005-04-10
  • 打赏
  • 举报
回复
楼主直接去问Bjarne.Stroustrup吧
http://www.research.att.com/~bs/homepage.html
llmsn 2005-04-10
  • 打赏
  • 举报
回复
看一下<<Inside the C++ Object Model>>吧.里面应该有讲的.

64,651

社区成员

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

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