c++ 虚函数的实现机制

在C++中虚函数在c++中的实现机制就是用虚表和虚指针。下面举个例子:

// 2014525_5.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>

using namespace std;

class A
{
public:
	virtual void f(){ cout << "基类A f"<<endl;};
	virtual void g(){ cout << "基类A g"<<endl;};
private:
	int a;
};

class B: public A
{
public:
	void g() { cout << "派生类B g" << endl;}
private:
	int b;
};

int _tmain(int argc, _TCHAR* argv[])
{
	A aA;
	B bB;
	A *pA= &bB;
	pA->g(); //call *(pA->__vfptr)[1]
	
	return 0;
}

我们通过对程序进行调试跟踪如下:

aA对象的内存分配:


很明显,编译器,为A类准备了一个虚拟表A::vftable

A::f 的地址
A::g 的地址
其中,__vfptr是虚指针,指向虚拟表A::vftable

bB对象的内存分配:


当某次出现B bB的时候,编译器分配空间,bB的布局如下:

__vfptr : 指向B的虚表B::vftable
int a: 继承A的成员
int b: B成员

因为B继承了A,故编译器也为B准备了一个虚拟表vftable:

A::f 的地址
B::g 的地址
其中,__vfptr是虚指针,指向虚拟表B::vftable.

注意,这里因为B:g重写了,因此B的虚表中的g是放B::g的入口地址。


pA的内存块区域:



参考:

http://blog.csdn.net/jiangnanyouzi/article/details/3720807

A::f 的地址
A::g 的地址
A::f 的地址
B::g 的地址
vptr : 指向B的虚表vtableB
int a: 继承A的成员
int b: B成员
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值