天天看點

虛函數以及c++成員函數的調用原理

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