发布网友 发布时间:2022-03-18 00:38
共2个回答
热心网友 时间:2022-03-18 02:07
typedef void( *Fun )( void ); //是吧Fun定义为一个没有参数,返回void类型的函数指针
*( ( int* ) * ( int* )( &b ) + i )这一段,
(int*)*相当于没有进行任何操作,所以等同于
*( ( int* )( &b ) + i )
这里先取b的地址,然后把地址转换成int*,之后+i是指针算术,也就是在b的地址上加一个int的长度,最后最前面的*是解指针,座椅这段最后返回的是“b的地址+i个int长度的值”
最前面的(Fun)是强制把“b的地址+i个int长度的值”转换为一个“没有参数,返回void类型的函数指针”,所以pFun就是一个函数指针,其指向的位置从一开始的b的地址,每次循环加一个int的长度
然后我们开看,b的地址,b是一个B类型,B类型的第一个函数是g(),而第一次循环pFun的地址就是b的地址,b又没有属性(私有或共有变量)所以b的地址就是b中第一个函数g的地址,所以第一次循环的pFun()相当于调用B::g
( Fun )*( ( int* ) * ( int* )( &b ) + i ); 这里*( ( int* ) * ( int* )( &b ) + i )最前面的*是对上面的结果进行解指针,也就取把b的地址+i个int长度的这个地址的值,并把它转换为Fun类型,也就是一个没有参数,返回void类型的函数指针,所以最后得到的就是一个函数指针。这个指针所指向的地址就是
然后我们来看循环,循环中3次pFun变量分别被赋了3次值,每次都是一个函数指针
由于B类型中有virtual函数,所以b的地址指向的是b的vtbl(如果你不知道这个,你面试就没戏了),vtbl可以看作一个保存了函数指针的数组,每个元素就是一个int长度,在vtbl中B::g,A::f,B::h是按照如上顺序排列的,所以第一次循环指向B::g,那么后两次就指向A::f和B::h了
至于为什么是按照这样的顺序排列的,是因为其声明顺序,首先是父类的virtual函数按照其生命顺序放入vtbl中,然后是子类的放进去,所以其顺序是:A::h,A::f(这是父类的声明顺序)子类中只有B::H是新声明的,所以顺序是A::g,A::f,B::h。
又因为b的类型是b,你知道什么事多态和动态绑定,就明白第一个调用的为什么是B::g而不是A::g了。
=================================================
这个是我找到的一个回答,本来自己对函数指针也不懂,学习了。分享给你:
http://zhidao.baidu.com/question/372005299.html?fr=fd
热心网友 时间:2022-03-18 03:25
你弄懂this指针运行的机制,你也就懂了虚函数的!这不是一言两语可以解释的,看看c++教程的this指针,相信你会懂的追问Fun pFun;这个是给Fun 定义一个对象吗
Fun 是从哪里来的 是系统里面的?
追答typedef void( *Fun )( void );
这是一个函数指针,pfun是函数指针定义的一个对象