天天看点

类中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函数无法通过对象来调用,因此二者是不能同时成立的。