剖析C++对象模型

多态:就是指多种形态

C++中虚函数的主要作用就是实现多态, 简单说父类的指针/引用调用重写的虚函数,当父类指针/引用指向父类对象调用的是父类的虚函数,指向子类对象时调用的是子类的虚函数。





#include
using namespace std;class Base
{
public:
	virtual void func1()
	{
		cout << "Base::func1" << endl;
	}	virtual void func2()
	{
		cout << "Base::func2" << endl;
	}private:
	int a;
};class Derive :public Base
{
public:
	virtual void func1()
	{
		cout << "Derive::func1" << endl;
	}	virtual void func3()
	{
		cout << "Derive::func3" << endl;
	}	virtual void func4()
	{
		cout << "Derive::func4" << endl;
	}private:
	int b;
};
int main()
{Base b;Deverse d;system("pause");return 0;
}



Base模型分析:

Base实例化的对象b, 通过监视窗口我们可以看到,b中不仅有成员变量_a ,还有__vfptr,它就是虚表指针,虚表指针中下标为0的指向Base::fun1()  ,下标为1的指向Base::fun2()


Derive模型分析:

Derive实例化对象d,他继承了Base类,所以可以看到不仅有数据_a还有数据_b,但是在虚函数指针中只显示了两个,按照继承规则,在d中应该有重写了Base的

Derive::fun1, 来自基类的Base::fun2  ,还有Derive::fun3, Derive::fun4

但是没有显示出来,这应该是vs的一个bug;

不过我们可以通过以下方式将他们打印出来:

typedef void (* FUNC) ();void PrintVTable (int* VTable)
{cout<<" 虚表地址>"<< VTable<", i , VTable[i ]);FUNC f = (FUNC) VTable[i ];f();}cout<


这样就可以显示出来了。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部