派生类的虚函数列表

我们知道,每个具有虚函数的类中都有一张虚函数表,在rdata中用以记录每个类中虚函数列表,或者说虚函数的地址,那么如果是继承关系的类,对于其基类中函数虚函数的派生类,其虚函数表又是怎样的呢?下面看下C++源代码和反汇编的对比


#include "stdafx.h"
#include
  
  
   
   
using namespace std;
class A
{
public:
	virtual void f(){cout<<"A::m\n";}
};
class B
{
public:
	virtual void g(){cout<<"B::g\n";}
	virtual void f(){cout<<"B::f\n";}
};
class C:public A,public B
{
public:
	void f(){cout<<"C::f\n";}
	virtual void gh(){cout<<"dsada\n";}
};
int _tmain(int argc, _TCHAR* argv[])
{
	A* a=new A();
	B* b=new B();
	C* c=new C();
	a->f();
	b->f();
	b->g();
	c->f();
	c->gh();	
	return 0;
}

  
  


.rdata:00402148 const A::`vftable' dd offset A::f(void) ; DATA XREF: _wmain+14o
.rdata:0040214C                 dd offset const B::`RTTI Complete Object Locator'
.rdata:00402150 const B::`vftable' dd offset B::g(void) ; DATA XREF: _wmain+2Bo
.rdata:00402150                                         ; _wmain+42o
.rdata:00402154                 dd offset B::f(void)
.rdata:00402158                 dd offset const C::`RTTI Complete Object Locator'{for `A'}
.rdata:0040215C const C::`vftable'{for `A'} dd offset C::f(void) ; DATA XREF: _wmain+49o
.rdata:00402160                 dd offset C::gh(void)
.rdata:00402164                 dd offset const C::`RTTI Complete Object Locator'{for `B'}
.rdata:00402168 const C::`vftable'{for `B'} dd offset B::g(void) ; DATA XREF: _wmain+4Fo
.rdata:0040216C                 dd offset [thunk]:C::f`adjustor{4}' (void)

从上面我们可以看到,类A和类B具有虚函数列表,但是对于多重继承的类C他的虚函数列表则有些不同,可以看到类C的虚函数列表分成了两部分,分别是基类A和B的一部分,对于基类A,它是有一个C::f覆盖了基类A中的f函数,除此之外还有C自己的gh()函数,而对于派生自类B中的那一部分,没有覆盖的基类B的函数g则是记录B的函数地址,而对于f()函数的前民有一个thunk修饰,thunk的解释如下在多重继承的情况下,查看虚函数表时,要准备遭遇一个不是指向虚函数表而是指向修改this指针的代码的指针,修改指针的目的在于使他指向从中得到"替换函数"的实例,在这里,也就是说要将类C中的继承类B的虚函数列表部分中的函数f替换成类C本身的f函数地址!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

世纪殇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值