现在的位置: 首页 > 综合 > 正文

上机_虚函数表内存分布(陈皓的)

2013年08月06日 ⁄ 综合 ⁄ 共 4285字 ⁄ 字号 评论关闭
文章目录

原文章链接是:http://blog.csdn.net/haoel/article/details/1948051

讲的很生动,但是有些小问题,评论里面有些说的非常详细。实验一把

class Base
{
public:
	virtual void f(){cout<<"Base::f()"<<endl;}
	virtual void g(){cout<<"Base::g()"<<endl;}
	virtual void h(){cout<<"Base::h()"<<endl;}
protected:
private:
};
class Base2
{
public:
	virtual void f(){cout<<"Base2::f()"<<endl;}
	virtual void g(){cout<<"Base2::g()"<<endl;}
	virtual void h(){cout<<"Base2::h()"<<endl;}
protected:
private:
};

//无覆盖,这样的话,虚函数就在原来的虚函数表后面追加就行了
class Derived:public Base
{
public:
	virtual void f1(){cout<<"Derived::f1()"<<endl;}
	virtual void g1(){cout<<"Derived::g1()"<<endl;}
	virtual void h1(){cout<<"Derived::h1()"<<endl;}
};

//有覆盖,这样的话相同的函数给覆盖掉
class Derived_cover:public Base
{
public:
	virtual void f(){cout<<"Derived_cover::f()"<<endl;}
	virtual void g1(){cout<<"Derived_cover::g1()"<<endl;}
	virtual void h1(){cout<<"Derived_cover::h1()"<<endl;}
};

//多重继承,无覆盖
class multipleDerived:public Base, public Base2
{
public:
	virtual void f1(){cout<<"multipleDerived::f1()"<<endl;}
	virtual void g1(){cout<<"multipleDerived::g1()"<<endl;}
};
//多重继承,有覆盖
class multipleDerivedCover:public Base, public Base2
{
public:
	virtual void f(){cout<<"multipleDerivedCover::f()"<<endl;}
	virtual void g1(){cout<<"multipleDerivedCover::g1()"<<endl;}
};
typedef void(*fun)(void);
//测试虚函数与虚函数表的存放关系
void test1()
{
	Base b;
	fun pfun = NULL;
	cout<<"虚函数表地址"<<(int*)*(int*)(&b)<<endl;
	cout<<"虚函数表 第一个函数地址"<<(int*)*(int*)*(int*)(&b)<<endl;
	cout<<"虚函数表 第二个函数地址"<<(int*)*((int*)*(int*)(&b)+1)<<endl;
	cout<<"虚函数表 第三个函数地址"<<(int*)*((int*)*(int*)(&b)+2)<<endl;
	//通过指针直接访问虚函数表里面函数的内容
	pfun = (fun)(int*)*(int*)*(int*)(&b);
	pfun();
	pfun = (fun)(int*)*((int*)*(int*)(&b)+1);
	pfun();
	pfun = (fun)(int*)*((int*)*(int*)(&b)+2);
	pfun();
}

//测试没有函数覆盖的情况,直接在原来的虚函数表后面追加
void test2()
{
	Base b;
	Derived derive;
	fun pfun = NULL;
	cout<<"虚函数表地址"<<(int*)*(int*)(&b)<<endl;
	cout<<"虚函数表地址"<<(int*)*(int*)(&derive)<<endl;
	cout<<"虚函数表 第一个函数地址"<<(int*)*(int*)*(int*)(&b)<<endl;
	cout<<"虚函数表 第一个函数地址"<<(int*)*(int*)*(int*)(&derive)<<endl;
	cout<<"虚函数表 第二个函数地址"<<(int*)*((int*)*(int*)(&b)+1)<<endl;
	cout<<"虚函数表 第二个函数地址"<<(int*)*((int*)*(int*)(&derive)+1)<<endl;
	cout<<"虚函数表 第三个函数地址"<<(int*)*((int*)*(int*)(&b)+2)<<endl;		
	cout<<"虚函数表 第三个函数地址"<<(int*)*((int*)*(int*)(&derive)+2)<<endl;

	//打印出虚函数内容
	pfun = (fun)(int*)*(int*)*(int*)(&derive);	
	pfun();
	pfun = (fun)(int*)*((int*)*(int*)(&derive)+1);
	pfun();
	pfun = (fun)(int*)*((int*)*(int*)(&derive)+2);
	pfun();
	pfun = (fun)(int*)*((int*)*(int*)(&derive)+3);
	pfun();
	pfun = (fun)(int*)*((int*)*(int*)(&derive)+4);
	pfun();
	pfun = (fun)(int*)*((int*)*(int*)(&derive)+5);
	pfun();

}

//有覆盖的情况,直接将原来的函数覆盖掉就行了
void test3()
{
	Base b;
	Derived_cover derive;
	fun pfun = NULL;
	cout<<"虚函数表地址"<<(int*)*(int*)(&b)<<endl;
	cout<<"虚函数表地址"<<(int*)*(int*)(&derive)<<endl;
	cout<<"虚函数表 第一个函数地址"<<(int*)*(int*)*(int*)(&b)<<endl;
	cout<<"虚函数表 第一个函数地址"<<(int*)*(int*)*(int*)(&derive)<<endl;
	cout<<"虚函数表 第二个函数地址"<<(int*)*((int*)*(int*)(&b)+1)<<endl;
	cout<<"虚函数表 第二个函数地址"<<(int*)*((int*)*(int*)(&derive)+1)<<endl;
	cout<<"虚函数表 第三个函数地址"<<(int*)*((int*)*(int*)(&b)+2)<<endl;		
	cout<<"虚函数表 第三个函数地址"<<(int*)*((int*)*(int*)(&derive)+2)<<endl;

	//打印出虚函数内容
	pfun = (fun)(int*)*(int*)*(int*)(&derive);//f将父类的f覆盖掉
	pfun();
	pfun = (fun)(int*)*((int*)*(int*)(&derive)+1);
	pfun();
	pfun = (fun)(int*)*((int*)*(int*)(&derive)+2);
	pfun();
	pfun = (fun)(int*)*((int*)*(int*)(&derive)+3);//
	pfun();
	pfun = (fun)(int*)*((int*)*(int*)(&derive)+4);
	pfun();
	cout<<"直接通过父类指针调用子类实现的函数的话"<<endl;
	Base* newBase = new Derived_cover;
	newBase->f();
	newBase->g();
	newBase->h();

}

//测试多重继承的情况,测试一下多重继承的虚函数表的内存分布,应该是有两个虚函数表,
//分别指向base,base2,无覆盖
void test4()
{
	cout<<"多重继承的内存分布"<<endl;
	multipleDerived myMultiple;
	fun pfun = NULL;
	cout<<"多重继承的虚函数1地址"<<(int*)*(int*)(&myMultiple)<<endl;
	cout<<"多重继承的虚函数2地址"<<(int*)*((int*)(&myMultiple)+1)<<endl;
	cout<<"虚函数表1应该是Base函数+子类未被覆盖的函数"<<endl;
	pfun = (fun)(int*)*(int*)*(int*)(&myMultiple);//vp1的fun1 base::f()
	pfun();
	pfun = (fun)(int*)*((int*)*(int*)(&myMultiple)+1);//vp1的fun2 base::g()
	pfun();
	pfun = (fun)(int*)*((int*)*(int*)(&myMultiple)+2);//vp1的fun3 base::h()
	pfun();
	pfun = (fun)(int*)*((int*)*(int*)(&myMultiple)+3);//vp1的fun4 multipleDerived::f1()
	pfun();
	pfun = (fun)(int*)*((int*)*(int*)(&myMultiple)+4);//vp1的fun4 multipleDerived::g1()
	pfun();
	cout<<"虚函数表2"<<endl;
	pfun = (fun)(int*)*(int*)*((int*)(&myMultiple)+1);
	pfun();
	pfun = (fun)(int*)*((int*)*((int*)(&myMultiple)+1)+1);
	pfun();

}

//测试多重继承有覆盖
void test5()
{
	cout<<"多重继承有覆盖"<<endl;
	multipleDerivedCover d;
	Base* d1 = &d;
	Base2* d2 = &d;
	d1->f();
	d2->f();

	d1->g();
	d2->g();
}

int main()
{

	test1();
	test2();
	test3();
	test4();
	test5();
	return 0;
}

抱歉!评论已关闭.