访问基类的私有虚函数
#include<iostream>
using namespace std;
class A
{
virtual void g()
{
cout << "A::g" << endl;
}
private:
virtual void f()
{
cout << "A::f" << endl;
}
};
class B : public A
{
void g()
{
cout << "B::g" << endl;
}
virtual void h()
{
cout << "B::h" << endl;
}
};
typedef void(*Fun)(void);
int main()
{
B b;
Fun pFun;
for(int i = 0; i < 3; i++)
{
pFun = (Fun)*((int* )* (int *) (&b) + i ); %求解释这个行什么意思
pFun();
}
return 0;
}
上面代码是演示虚函数的,但是我有一行不明白,不知道该怎么分析,
就是我注释的那一行,不知道啥意思,怎么理解
[解决办法]
(Fun)*((int* )* (int *) (&b) + i )
首先,取得b的地址(&b)
然后强制转换为(int*)类型
再从地址取值*
把取到的值转换为(int*)类型
把得到的int*(指向有符号整数的指针)加上i。。。这一步得到了一个指针
取刚得到的指针所指向的地址的值*
将这个值转换为Fun类型(这是一个函数指针类型)
[解决办法]
从里往外看
&b得到b对象的地址,实际上是vptr
将之强制类型转换成int*
(int *)(&b)
在解引用
*(int*)(&b)
得到的是vtable的首地址内指向的内容
又来一个强制类型转换(int*)
再+i
(int* )* (int *) (&b) + i
循环取出vtable里的slot
最后就是强制转换成函数指针
[解决办法]
这是取虚函数表中的函数地址
要看懂,需要看看虚函数的内存模型,网上有的是介绍,google之