object Model(对象模型):关于vptr和vtbl

这里设置了3个class,A,B,C之间是继承的关系,A有之间的data1和2,B继承了A,有了A的数据,然后加上自己的数据,C也是。

如果一个类里面有一个虚函数,这个对象里面就会多了一个指针,指向虚函数表。

如果父类有虚函数,子类一定有,会继承父类虚函数的调用权,这时候以B为例子,B推翻了vfunc1()重载了,留下了vfunc2().

vptr关联了vtbl(里面都是函数指针)然后关联了虚函数。

通过new c可以得到p,通过p要调用vfunc1(),因为vfunc1是虚函数,所以编译器不能通过老式的call一个地址(静态绑定),就只能通过动态绑定去寻找这个函数,如

(* (p-vptr)[n])(p);

(* p->vptr[n])(p);

n表示表的第几个。


如果想设计一个能够画出各个图形的程序,首先为了让一个容器可以容纳各个对象,每个对象的大小肯定不一样,所以不好放入容器,只能通过指针指向同类,这个指针必须是父类,因为所有的东西都是它的一种。我们通过这个指针去调用draw,各自的指针就会调用自己的虚函数去画自己。

以前我们会对各种类型使用enum来判断这是什么图形,然后通过转接表的编号判断去调用哪个函数,在C语言中如果我现在多了几个新的图形,又得重新修改代码,现在在C++中就不用了。

符合下列3个条件(动态绑定):

1、是指针

2、向上转型

3、调用的是虚函数

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值