C++虚函数表(虚函数覆盖继承)

2013年4月17日 由 Creater 留言 »

o_Drawing4上一篇C++虚函数表在一般继承(没有重写基类的虚函数情况下)时虚函数的分布。

通常派生类都是需要覆盖基类的虚函数来达到多态的目的。

如图所示,基类的3个虚函数,在派生类中有一个被覆盖,另外两个被继承,而且派生类中定义了2个虚函数。

还是先看代码,以及运行结果。

 

 

 

#include
#include
using namespace std;
class Base
{
public:
	virtual void f() { cout << "Base::f" << endl; }
	virtual void g() { cout << "Base::g" << endl; }
	virtual void h() { cout << "Base::h" << endl; }
};
class Derived:public Base
{
public:
	virtual void f() { cout << "Derived::fd" << endl; }
	virtual void gd() { cout << "Derived::gd" << endl; }
	virtual void hd() { cout << "Derived::hd" << endl; }
};

int main()
{
	typedef void(*Fun)(void);
	Derived b;
	Fun pFunc = NULL;
	cout<<"虚函数表地址"<<(int*)(&b)<<endl;
	cout<<"虚函数表中第1个函数地址"<<(int*)*(int*)(&b)<<endl;
	cout<<"虚函数表中第2个函数地址"<<((int*)*(int*)(&b)) + 1<<endl;
	cout<<"虚函数表中第3个函数地址"<<((int*)*(int*)(&b)) + 2<<endl;
	pFunc = (Fun)*((int*)*(int*)(&b));
	pFunc();
	pFunc = (Fun)*((int*)*(int*)(&b) + 1);
	pFunc();
	pFunc = (Fun)*((int*)*(int*)(&b) + 2);
	pFunc();
	pFunc = (Fun)*((int*)*(int*)(&b) + 3);
	pFunc();
	pFunc = (Fun)*((int*)*(int*)(&b) + 4);
	pFunc();
	return 0;
}

运行结果为:

虚函数表地址0xbf950c58
虚函数表中第1个函数地址0x8048b88
虚函数表中第2个函数地址0x8048b8c
虚函数表中第3个函数地址0x8048b90
Derived::fd
Base::g
Base::h
Derived::gd
Derived::hd

由此可以看出,首先检查基类的virtual函数,如果在派生类中有覆盖,则将派生类的该虚函数地址放入虚函数表;如果基类的virtual函数在派生类中没有覆盖,则将这些虚函数继承并将地址添加到虚函数表,最后是派生类自己定义的虚函数。
o_vtable3
如果有这样的代码:

Base *base = new Derivesd();
base->f();

base所指内存的派生类对象的虚函数表中,f这个基类的虚函数已经被派生类的f替代。于是在实际调用发生时就实现了多态。

广告位

发表评论

你必须 登陆 方可发表评论.