各位,有谁愿意进来谈谈对虚拟函数的理解的~~讲的越详细,给的分越多~~~

caoyun 2003-08-29 09:51:59
~~
...全文
31 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
akiko 2003-08-30
  • 打赏
  • 举报
回复
pObject->vfunc();
单一继承时的情况简单一些,编译时虽然不知道具体哪个vfunc会被调用,但是知道这个vfunc的地址放在vtable的第几个slot中.
多重继承和虚拟继承则麻烦一些,还要根据实际的情况调整vptr,来决议使用哪一个vtable.
caoyun 2003-08-30
  • 打赏
  • 举报
回复
大家看看这个`~http://www.c-view.org/journal/001/cpp_critique.htm
jakeye 2003-08-30
  • 打赏
  • 举报
回复
学习ing
caoyun 2003-08-30
  • 打赏
  • 举报
回复
大家加油呀~~~下午结了哈`~~
谢谢大家`~~~`
chanet 2003-08-30
  • 打赏
  • 举报
回复


多态性的一种表现...


有自己的一套,不一定要与基类相同... 可重新来过...(从现在,非基类)
null2002 2003-08-30
  • 打赏
  • 举报
回复
真的是胡说八道,不是需要哪个就编译哪个,是一块编译,一块装入内存,到运行时才确定调用哪个。这就是所说的运行时的多态。

其实,虚函数就是提供了一个类的成员函数的接口,你可以对这个接口进行重载,根据需要使这个接口指向不同内存地址,就是说根据需要调用不同函数。

虚函数的实现机制是这样的:
如果一个类有一个虚函数,系统就为这个类创建一个虚函数表(就是楼上几位提到的vtable),这个虚函数表存放了虚函数的入口地址,到运行时根据你使用的类的指针来在不同的类的虚函数表中寻找所需要的虚函数的地址。
它与一般的重载的不同就是,一般的类成员函数的重载,调用哪个类的函数,看的是类指针的类型。而虚函数的重载中,调用哪个函数,看的是指针指向的是哪个类。这样就好记了。
  • 打赏
  • 举报
回复
其实我觉得虚函数的用途是充分利用机器的机能,需要哪个就编译哪个,暂时不需要就先不理.
caoyun 2003-08-29
  • 打赏
  • 举报
回复
各位,能给例子,结合例子谈,最好~~分不够的话我再给~~~明天下午结帖,希望大家顶住`~~
SmileWolf 2003-08-29
  • 打赏
  • 举报
回复
虚拟函数是C++多态性的实现方式。也就是说如果你把类的成员函数声明成了虚拟函数,那么,你就可以在程序里放心大胆的使用基类的指针,编译器会给你转换成相应的子类的函数调用。这中特性,在底层是靠虚函数表——VTABLE来实现的。
编译器只要一发现你的类声明中有函数用了virtual这个关键字,就会在这个类的开头或末尾(与具体编译器有关)加入一个指针——VPTR。这个指针就指向VTABLE的首地址。并把所有用virtual声明了的成员函数的地址都放入VTABLE中。
这个时候,当你调用一个成员函数时,就变成了顺着VPTR找到VTABLE,再调用相应的函数。这样就不会调错了。
oopig 2003-08-29
  • 打赏
  • 举报
回复
本质上就是通过函数指针进行函数调用,然后几个函数函数指针放在一起就成了vtable。
还有就是虚函数的调用时机问题,比如没有办法在基类的构造函数中调用子类重载的虚函数。
还有就是虚析构函数,需要通过基类指针释放子类对象的,基类的析构函数应该是虚拟的。
然后就是虚函数的应用,比如和模版结合起来,那就很丰富了。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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