类中static函数能否virtual ?

关于类中静态函数能否为虚函数问题,有网友给出解释很有道理,与大家共同分享一下:


解释一:http://topic.csdn.net/t/20060603/08/4797568.html   (CSDN OOPhaisky)

首先,从“宏观”上来说,static成员函数其实并不算“成员”,它相当于在类域中定义了一个全局函数(哈哈,好像有点儿自相矛盾,但是相信大家能够理解),所以static成员函数与对象是没有“耦合”关系的(即,可以直接通过类调用static成员函数)。但是,virtual成员函数是绝对的“成员”,它与对象是100%的“耦合”(即,只能通过对象来调用virtual成员函数才有意义)。 

其次,从“微观”上来说,为什么访问virtual成员函数一定要通过指针/引用/对象来进行呢(即,必须要有一个实际的对象存在)?因为要想正确定位到实际应该执行的函数,必须通过对象中的vptr(看清,是“对象中的vptr”,所以必须有对象)找到此class的virtual   table然后利用virtual   table中某个索引处的函数指针来访问实际的成员函数。从此处可以看出,static成员函数的“不通过对象直接通过类名便可以调用”的特点不适用于virtual成员函数(virtual成员函数一定要通过指针/引用/对象来进行),所以函数不能同时为“virtual   static”。 


解释二:http://topic.csdn.net/t/20060603/08/4797568.html  (CSDN liking100

static成员没有this指针是关键! 
static   function都是静态决议的(编译的时候就绑定了), 
而virtual   function   缺是动态决议的(运行时候才绑定)! 
所以virtual   function   不能为static!


个人总结:

关于静态函数能否为虚函数问题,主要涉及静态函数和虚函数的编译时机的不同。static函数属于静态联编即在编译时候就绑定成功;而virtual函数属于动态联编,通过相应对象中的虚函数表指针需找到相应的虚函数指针,完成动态绑定。关键之处在于static函数没有this指针,属于类而不属于具体对象,因此static函数无法通过对象来调用,因此二者是不能同时成立的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值