(6)对象模型-浅谈

关于vptr和vtbl

  • 虚指针和虚表,一个类的对象内存占用什么样的内存?当一个类有虚函数的时候,对象里面就会多一个指针。一个虚函数和一万个虚函数是一样的。
  • 继承会把成员变量继承也会把函数调用权继承下来。

 

一般的函数和虚函数区别。

  • 虚拟表中存放的都是指针,虚函数指针。
  • 编译器看见调用虚函数时,采用动态绑定。通过虚指针,查看虚表,再看调用的是哪一个函数。(普通函数调用采用动态绑定)(* p->vptr[n])(p);编译器会找到n的位置编号。

 

静态绑定    call XXXX
动态绑定,条件1、通过指针调用;2、指针是向上转型 up case;3、调用的是虚拟函数。(多态)

/*
(1)class中有虚函数时,对象中会多一个指针,0x409004,内存会多四字节;
(2)classB继承classA,classB有自己的vfunc1(),有classA的vfunc2();
(3)继承是继承的调用权,不是内存大小;
(4)父类有虚函数,子类肯定有虚函数;
(5)子类中函数与父类同名,但不是一个函数。
*/

 

关于this

  • 模板方法,this指针的使用场景。会把当前对象当做this指针传到方法里面。一个父类的方法A里面调用了一个虚函数,这个虚函数在子类中重载,这样当子类调用父类的方法A时,会通过父类的A函数,调用子类重载过的虚函数。
  • 所有的成员函数都隐藏了一个this参数。

 

关于 Dynamic Binding

  • 非指针调用不会产生动态绑定。
  • 通过指针找到虚指针,找到虚表,找到相应的函数地址。

(1)静态绑定一定是绑定某个地址;

(2)动态绑定的三个条件:通过指针调用,指针是向上转型,调用的是虚函数。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值