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