多虚函数表指针的一点困惑

yby4769250 2011-08-20 02:05:37
以前,学习C++的多态时,从网上搜了N多的资料,认识并熟悉了虚函数表,但是,对于虚表指针的认识也只是人云亦云,但是,随着学习的深入,最近又回去复习了多态,并又看了虚表指针,如这个经典的帖子
http://blog.csdn.net/hairetz/article/details/4137000
但是,我始终有这样的问题,在该帖子的第一张图中,(事先声明, 整篇帖子都是非虚拟继承)编译器根本就没必要维护一张虚函数表,因为在继承的类层次结构上看,先从base的角度看,他自己的函数,无论是vir还是非vir函数,都应当统统当做普通成员函数来对待,因为自己的虚函数,对自己是没有多态的,一个类所声明的虚函数,语义上,是表明在他的子类中才会表现出多态,因此,只有必要在子类中维护虚表以提供多态机制即可,而没有必要画蛇添足,在父类中为自己的虚函数添加虚表,你能解释,在父类中,为自己的虚函数添加虚表的目的是什么吗?语义上表明什么?难道自己调用自己的函数,还要几步跳转,这既浪费空间,又浪费效率。
我始终认为,从类的层次结构上看, 以及从虚函数的语义上看,一个类,没有必要为自己的虚函数维护虚表,统统当做普通成员函数对待,只需要在派生类中维护虚表,因为前面已经提到过,一个类的虚函数不是给自己表达多态的语义的,而是给派生类表达多态的语义,因此,就只需要派生类中提供虚表即可。
但是,好多的博文中,都出现了这种情况,一旦一个类有虚函数,那么这个类就会产生一枚虚表指针,指向这些虚函数,如果这真是事实,那么原因,到底是编译器为了追求简单,对虚函数采取统一处理?还是,编译器都不理解虚函数语义上是在哪一个类层次上才会表现出多态。
希望有兴趣的讨论一下
...全文
84 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
yby4769250 2011-08-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 bluesky12312388 的回复:]
不管它编译器如何实现。

自己用C实现一遍多态一切明了,事实上早期的编译器cfront就是把C++代码编译成C代码的。
[/Quote]
这个想法非常不错
Harper 2011-08-20
  • 打赏
  • 举报
回复
bluesky12312388 2011-08-20
  • 打赏
  • 举报
回复
不管它编译器如何实现。

自己用C实现一遍多态一切明了,事实上早期的编译器cfront就是把C++代码编译成C代码的。
xwfde 2011-08-20
  • 打赏
  • 举报
回复
虚函数为了实现多态,多态只有通过指针访问时才表现出来。例如类A导出类B,
A a:
B b:
a.p()或b.p()是没有任何多态而言的。
只有A *pa:pa=&a或pa=&b后调用pa->p(),才显示出多态来,此时的函数p需要从pa 指向的对象的虚函数指针表中找出来,假如父类没有这个表指针那么怎么找呢?假如父类有指针但没有表,那么只能是个空指针,这时需要做一个判断,那又降低了执行效率。所以父类子类都需要表
184270428 2011-08-20
  • 打赏
  • 举报
回复
虚函表实际上是把函数地址在类内数据化,数据化后是可以被复盖的。
而普通方法,是编译器在调用的地方把方法地址填充到调用点。

64,651

社区成员

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

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