当前位置:   article > 正文

[C++]虚函数与静态函数冲突

虚函数发生访问冲突

今天看到一个有意思的C++语法问题。就是如果一个派生类中含有与基类虚函数重名的静态成员函数,用指针调用会如何。代码如下:

#include <iostream>
using namespace std;

class
A                                                     
{
public
:
    
void virtual print(){ cout<<"A::print()"<<
endl; }
};

class B :public
A
{
public
:
    
void virtual print(){ cout<<"B::print()"<<
endl; }
} ;
class C :public
B   
{
public
:
    
static void print(){ cout<<"C::print()"<<
endl; }
} ;

void
print (A a)                   
{   
     a.print();                         
}

void
main()
{                                                                                                           
     A a,
*aa, *ab, *
ac;                       
     B b;                                                                         
     C c;
     aa
=&
a;                                                                                                       
     ab
=&
b;                           

     ac
=&
c;   
                                           
    
//c.print();                                                         

     ac-> print();                                     
}

大家可以猜猜结果。

================================

【答案】

B::print()

【我的分析】

在调用函数时,当然会先进行名字查找,根据ac的静态类型,那么肯定是A了,在A的作用域中找到了名为print()的函数,查找结束。进行圆形匹配,发现也是匹配的。然后因为ac是指针,调用函数时发生动态绑定,而C类含有虚函数表。所以应该先去C类的虚函数表中查找print(),但是C类的虚函数表其实是跟B类一样的(因为C类并没有增添任何的虚函数)。这个时候当然只找得到B::print了。

但是如果是使用对象调用,如c.print(),不是动态绑定的,那还是会调用C::print。参见注释的一行。

当然编译器给出了一个警告:静态函数是不能用作虚函数进行调用的(MSVC:warning c4526)。






转载于:https://www.cnblogs.com/microgrape/archive/2011/05/11/2043779.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/731425
推荐阅读
相关标签
  

闽ICP备14008679号