为什么静态成员函数不能是虚函数?

iCplusplus 2011-03-05 05:20:53
为什么静态成员函数不能是虚函数?
...全文
1802 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
helloangel8002 2011-03-05
  • 打赏
  • 举报
回复
学习 静态在我看来是与生俱来的


虚函数 是为了实现多态
FrankHB1989 2011-03-05
  • 打赏
  • 举报
回复
LS就实现已经说得很清楚了。
设计方面的原因:虚函数是为了实现运行期函数和对象(类的实例)的动态绑定,通过对象的指针或引用访问被指向的对象,只要有继承关系,被访问的对象的实际类型可以和指针或引用指向的类型不同。如果没有对象,那么这种多态就没有意义,因为根本不存在需要在运行期确定对象类型的必要。所以只从属于类而不和具体对象相关的静态成员函数作为虚函数是没有意义的,因此语言禁止这么做。
其它类型的多态(静态多态)也是有的,最简单的像函数重载,还有如用模板(而不是虚函数)实现的继承多态。
dcw0402 2011-03-05
  • 打赏
  • 举报
回复
虚函数实现多态是通过vfptr这个虚函数表的指针来实现的.
如Base类里有一个函数f是虚函数.编译时f函数的地址就会记录到vfptr[x]里.
而如果Derive派生自Base,且Derive重写了f函数.那么在产生子类对象时Derive::f的地址将覆盖子类对象里的vfptr[n]即Base::f地址.
从上面你也可以看出实现多态(必须用指向子类对象的基类指针调用)是通过被实例化的对象的地址进而找到vfptr[m]实现的.通过对象必须,不就是this指针么.
当然你可以不用指向子类的基灰指针调用虚函数.如Derive d;d.f()那么就不是多态了.这种调用方法毫无疑问也用到了this指针.而这个实现原理是同名覆盖.虚函数也失去了设计他的意义.
iCplusplus 2011-03-05
  • 打赏
  • 举报
回复
为什么虚函数一定要用 this 指针?
dcw0402 2011-03-05
  • 打赏
  • 举报
回复
静态函数属于整个类不属于某个具体的对象.没有this指针.不知能不能这样说.你参考吧.
雪人2015 2011-03-05
  • 打赏
  • 举报
回复 4
虚函数是与类对象捆绑的。

而类的普通成员函数(包括虚函数)在编译时加入this指针,通过这种方式可以与对象捆绑,而静态函数编译时不加this,因为静态函数是给所有类对象公用的,所以没有在编译时加this,所以无法与对象捆绑,而虚函数就是靠着与对象捆绑加上虚函数列表才实现了动态捆绑。所以没有this指针虚函数无从谈起。
dcw0402 2011-03-05
  • 打赏
  • 举报
回复
构造函数不能是const常函数,也不能是虚函数.不能是静态函数.
虚函数不能是静态的.原理楼上的已经说了.虚函数底层是用this来实现的.
碎碎念 2011-03-05
  • 打赏
  • 举报
回复
虚函数是为了多态设计的....静态成员函数独立于对象存在,没有this指针...所以不能设计成虚函数...
liutengfeigo 2011-03-05
  • 打赏
  • 举报
回复
仔细琢磨琢磨.
pengzhixi 2011-03-05
  • 打赏
  • 举报
回复
静态成员函数都不含this指针,又怎么能为虚函数。

65,170

社区成员

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

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