C++虚函数表(一般继承时)

2013年4月17日 由 Creater 留言 »

在上一篇里的《C++虚函数表》里说了单个类对象的虚函数布局,但是如果涉及到继承,情况会有不同。下面针对一般继承,一般继承就是o_vtable2

说:基类有虚函数,但是子类并没有重载这些基类的虚函数,而是重新定义自己的虚函数。如图所示。

这种情况下,派生类自己的虚函数表既包含了基类的函数指针,也包含了派生类自己的函数指针。怎么分布,看下面的解析。

 

 

 

 

代码如下所示:

#include <iostream>
#include <algorithm>
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 fd() { 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();
	pFunc = (Fun)*((int*)*(int*)(&b) + 5);
	pFunc();

	return 0;
}

结果为:

虚函数表地址0xbf85d2d8
虚函数表中第1个函数地址0x8048bc8
虚函数表中第2个函数地址0x8048bcc
虚函数表中第3个函数地址0x8048bd0
Base::f
Base::g
Base::h
Derived::fd
Derived::gd
Derived::hd

至此,可以清晰看到,派生类对象中的虚函数表包含了基类的虚函数与自己定义的虚函数,排列方式为基类在前,派生类在后。图示。
o_vtable22

 

 

广告位

发表评论

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