社区
C++ 语言
帖子详情
为什么静态成员函数不能是虚函数?
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指针,又怎么能为虚函数。
300道C++题目
300道C++题目
C/C++指针经典资料大全
C/C++指针经典资料大全,十余部经典资料书籍,是您精通C指针的理想教程。
为什么
静态成员
函数
不能
是
虚
函数
在有
虚
函数
的类实例中,this指针调用vptr指针,指向的是vtable(
虚
函数
列表),通过
虚
函数
列表找到需要调用的
虚
函数
的地址。总体来说
虚
函数
的调用关系是:this指针->vptr->vtable ->virtual
虚
函数
。静态
函数
没有this指针,无法找到
虚
函数
。所以
静态成员
函数
不能
是
虚
函数
。
静态成员
函数
属于类本身(所有对象共用),不属于类中的任何一个对象。this指针指向的是每一个对象,
不能
用this指针来访问。但是对于
虚
函数
的调用需求this指针。所以
静态成员
函数
不能
是
虚
函数
。
静态成员
函数
为什么
不能
是
虚
函数
首先什么是static
静态成员
函数
?
静态成员
函数
不属于类中的任何一个对象和实例,属于类共有的一个
函数
。也就是说,它
不能
用this指针来访问,因为this指针指向的是每一个对象和实例。 对于virtual
虚
函数
,它的调用恰恰使用this指针。在有
虚
函数
的类实例中,this指针调用vptr指针,指向的是vtable(
虚
函数
列表),通过
虚
函数
列表找到需要调用的
虚
函数
的地址。总体来说
虚
函数
的调用关系是:this指针->vptr(4字节)->vtable ->virtual
虚
函数
。 所以说,stat
内联
函数
、构造
函数
、
静态成员
函数
为何
不能
为
虚
函数
1、因为有
虚
函数
的类对象必有
虚
函数
指针(vfptr),
虚
函数
指针指向
虚
函数
表(vftable),因为内联
函数
无地址,所以
不能
为
虚
函数
; 2、有
虚
函数
指针,必须要先有对象,若对象不存在,则vfptr必定不存在,若连构造
函数
还没调用,则必没有对象,就是说必须先有构造
函数
,才有对象,所以构造
函数
不能
为
虚
函数
; 3、
虚
函数
表指针属于类对象,而
静态成员
函数
属于类,不依赖于类对象,所以
静态成员
函数
也
不能
为
虚
函数
; ...
C++ 语言
65,170
社区成员
250,526
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章