虚函数表与动态绑定

(你可能会有一个疑问:编译器是如何实现虚函数的呢?)

虚表:

  • 每个多态类有一个虚表(virtual table)
  • 虚表中有当前类的各个虚函数的入口地址
  • 每个对象有一个指向当前类的虚表的指针(虚指针vptr)


动态绑定的实现:

  • 构造函数中为对象的虚指针赋值
  • 通过多态类型的指针或引用调用成员函数时,通过虚指针找到虚表,进而找到所调用的虚函数的入口地址
  • 通过该入口地址调用虚函数


样例:(图表与程序对应)


#include<iostream>
class Base
{
	public:
		virtual void F()  {  printf("F1\n");  }
		virtual void G()  {  printf("G1\n");  }
	private:
		int i;
};
class Derived:  public Base
{
	public:
		virtual void F()  {  printf("F2\n");  }
		virtual void H()  {  printf("H2\n");  }		//新增的虚函数
	private:
		int j;
};
int main(void)
{
	Base p;
	Derived q;
	printf("%d %d\n", sizeof(p), sizeof(q));		//输出结果:8 12,因为有一个隐藏的指向虚函数表的指针
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值