c – vtable:基础算法

栏目: 编程工具 · 发布时间: 5年前

内容简介:翻译自:https://stackoverflow.com/questions/43450179/vtable-underlying-algorithm

我对vtable的理解是,如果我有一个具有虚函数的Cat,带有子类Lion和HouseCat的函数,则有一个vtable,它将speak()映射到每个子类的正确实现.所以一个电话

cat.speak()

编译成

cat.vtable[0]()

也就是说,在vtable位置0中查找并在该位置调用函数指针.

我的问题是:多重继承会发生什么?

让我们添加一个Pet类. Pet有虚函数speak()和eat(). HouseCat扩展了Pet,而Lion则没有.现在,我需要确保这一点

pet.eat()

编译为

pet.vtable[1]()

那是vtable [0]需要说话(). Pet.eat需要是插槽1.这是因为cat.speak()需要访问vtable中的插槽0,如果对于HouseCat,插槽0恰好吃掉了,这将是非常错误的.

编译器如何确保vtable索引适合在一起?

规范没有设置任何内容,但通常编译器会为每个直接的非虚拟基类生成一个vtable,并为派生类生成一个vtable – 然后第一个基类的vtable和派生类的vtable将是合并.

更具体地说,编译器在构造类时生成的内容:

>猫

[vptr | Cat fields]
 [0]: speak()

>宠物

[vptr | Pet fields]
 [0]: eat()

>狮子

[vptr | Cat fields | Lion fields]
 [0]: speak()

> HouseCat

[vptr | Cat fields | vptr | Pet fields | HouseCat fields]
 [0]: speak()        [0]: eat()

编译器在调用/强制转换时生成的内容(变量名称是静态类型名称):

> cat.speak()

> obj [0] [0]() – 适用于Cat,Lion和HouseCat的“Cat”部分

> pet.eat()

> obj [0] [0]() – 对宠物和HouseCat的“宠物”部分有效

> lion.speak()

> obj [0] [0]() – 对Lion有效

> houseCat.speak()

> obj [0] [0]() – 对HouseCat的“Cat”部分有效

> houseCat.eat()

> obj [Cat size] [0]() – 对HouseCat的“Pet”部分有效

>(猫)houseCat

> obj

>(宠物)houseCat

> obj猫的大小

所以我想让你感到困惑的关键是(1)多个vtable是可能的,(2)upcasts实际上可能返回一个不同的地址.

翻译自:https://stackoverflow.com/questions/43450179/vtable-underlying-algorithm


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

智能Web算法(第2版)

智能Web算法(第2版)

【英】Douglas G. McIlwraith(道格拉斯 G. 麦基尔雷思)、【美】Haralambos Marmanis(哈若拉玛 玛若曼尼斯)、【美】Dmitry Babenko(德米特里•巴邦科) / 达观数据、陈运文 等 / 电子工业出版社 / 2017-7 / 69.00

机器学习一直是人工智能研究领域的重要方向,而在大数据时代,来自Web 的数据采集、挖掘、应用技术又越来越受到瞩目,并创造着巨大的价值。本书是有关Web数据挖掘和机器学习技术的一本知名的著作,第2 版进一步加入了本领域最新的研究内容和应用案例,介绍了统计学、结构建模、推荐系统、数据分类、点击预测、深度学习、效果评估、数据采集等众多方面的内容。《智能Web算法(第2版)》内容翔实、案例生动,有很高的阅......一起来看看 《智能Web算法(第2版)》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具