C++ 动态联编和及虚函数表

class BaseA
{
public:
	BaseA()
	{
		cout << __FUNCTION__ << endl;
	}
	virtual ~BaseA()
	{
		cout << __FUNCTION__ << endl;
		TestA();	// 调用 Base::TestA();调用作用域内的函数
	}
	virtual void TestA()
	{
		cout << __FUNCTION__ << endl;
	}
	int varA;
};

class ClassB :public BaseA
{
public:
	ClassB()
	{
		cout << __FUNCTION__ << endl;
	}
	virtual void TestA()
	{
		cout << __FUNCTION__ << endl;
		
	}
	virtual ~ClassB()
	{
		cout << __FUNCTION__ << endl;
		TestA();	// 调用ClassB::TestA(),调用作用域内的函数
	}

	virtual void TestB()
	{
		cout << __FUNCTION__ << endl;
	}
	int varB;
};

class ClassC :public ClassB
{
public:
	ClassC()
	{
		cout << __FUNCTION__ << endl;
	}
	~ClassC()
	{
		cout << __FUNCTION__ << endl;
		TestA();	// 调用ClassB::TestA(),调用作用域内的函数
	}
	virtual void TestA()
	{
		cout << __FUNCTION__ << endl;
	}
	virtual void TestB()
	{
		cout << __FUNCTION__ << endl;
	}

	virtual void TestC()
	{
		cout << __FUNCTION__ << endl;
	}
	int varC;
};

 

using pMemFunc =  void(*)();	// 定义函数指针,C++11新语法

int _tmain(int argc, _TCHAR* argv[])
{
	ClassB *pB = new ClassB();

	ClassB *pC = new ClassC();

	int SizeofBase = sizeof(BaseA);		// SizeofBase 值为8
	int SizdofClassB = sizeof(ClassB);	// SizdofClassB 值为12
	int SizdofClassC = sizeof(ClassC);	// SizdofClassC 值为16
	BaseA *pAB = (BaseA *)pB;
	BaseA *pAC = (BaseA *)pC;
	ClassB *pBC = (ClassB *)pC;

	pAB->TestA();	// 输出 ClassB::TestA

	pAC->TestA();	// 输出 ClassC::TestA
	
	pBC->TestB();	// 输出 ClassC::TestB
	
	// 直接访问虚函数表
	long *pVftableB = (long*)*((long *)pAB);

	// 得到虚函数表中的索引为1的函数地址,在VS编译器中,虚拟析构函数在虚函数表的第一个位置
	pMemFunc  pTestA = (pMemFunc)(pVftableB[1]);
	pTestA();		// 输出 ClassB::TestA

	pMemFunc  pTestB = (pMemFunc)(pVftableB[2]);
	pTestB();		// 输出 ClassB::TestB

	long * pVftableC = (long*)*((long *)pC);
	pTestA = (pMemFunc)(pVftableC[1]);
	pTestA();		// 输出 ClassC::TestA
	pTestB = (pMemFunc)(pVftableC[2]);
	pTestB();		// 输出 ClassC::TestB

	pMemFunc  pTestC = (pMemFunc)(pVftableC[3]);
	pTestC();		// 输出 ClassC::TestC

	delete pB;	
	// 依次输出
	//	ClassB::~ClassB
	//	ClassB::TestA
	//	BaseA::~BaseA
	//	BaseA::TestA
	delete pC;	
	// 依次输出
	// 	ClassC::TestA
	// 	ClassB::~ClassB
	// 	ClassB::TestA
	// 	BaseA::~BaseA
	// 	BaseA::TestA
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值