首页 > 编程语言 > 详细

C++_虚函数的晚捆绑如何实现

时间:2020-08-09 09:12:50      阅读:79      评论:0      收藏:0      [点我收藏+]
// Upcasting during array initialization:
Instrument* A[] = {
    new Wind,
    new Percusion,
    new Stringed,
    new Brass,
};

每当创建一个包含虚函数的类或从包含有虚函数的类派生一个类时,编译器就为这个类创建唯一的VTABLE,类中存放指向这个表的指针VPTR。因此不管类中有多少虚函数,都只需要一个指针。如果派生类中没有对基类中virtual进行重新定义,编译器就是用基类的这个虚函数的地址。VPTR不许被初始化为指向相应的VTABLE的其实地址,这在构造函数中发生。

技术分享图片

 

对于所有的Instrument对象或由Instrument派生的对象,他们的VPTR都在对象的相同位置,通常在对象的开头,所以编译器能去除这个地址,得到VTABLE的起始地址,所有的VTABLE都具有相同的顺序,所以编译器知道adjust函数必在VPTR+2处。

因为获取VPTR和确定实际函数地址发生在运行时,所以得到了希望的晚捆绑。

 

C++_虚函数的晚捆绑如何实现

原文:https://www.cnblogs.com/McFarland-Miriam/p/13461149.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!