class base11
{
public:
base11()
{
m_i=0;
}
virtual int get()
{
return m_i;
}
public:
int m_i;
};
class subclass : public base11
{
public:
subclass()
{
m_j=1;
}
virtual int get()
{
printf("hello,%d\n",m_j);
return 0;
}
public:
int m_j;
};
int main()
{
base11* p = 0;
subclass q;
p = &q;
int (*fun)(base11*) = NULL;//c++成员函数的调用,编译器底层会再传入一个对象的指针,也就是能在成员函数中使用的this指针,所以这里传入对象指针;但是也可以不传入对象的指针,由编译器自动添加对象的指针,所以还可以这样写(下段程序):
fun = (int(*)(base11*))((*(unsigned int**)&q)[0]);//
fun(p);
}
base11* p = 0;
subclass q;
p = &q;
int (*fun)() = NULL;
fun = (int(*)())((*(unsigned int**)&q)[0]);//unsigned int ** 将&q变成了指向一个数组的指针,并且这个数组的元素还是指针;*(unsigned int**)&q,的作用是取这个数组的第一个元素,取出来还是地址,也可以认为是一个指针,指向了虚函数表,同时虚函数表也是一个数组,((*(unsigned int**)&q)[0]虚函数表中的第一个元素,这个元素同样是个指针,指向了成员函数的地址
fun();
转自:http://blog.csdn.net/pennyliang/article/details/7648313