内容简介:翻译自: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
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
反应式设计模式
Roland Kuhn、Brian Hanafee、Jamie Allen / 何品、邱嘉和、王石冲、林炜翔审校 / 清华大学出版社 / 2019-1-1 / 98.00 元
《反应式设计模式》介绍反应式应用程序设计的原则、模式和经典实践,讲述如何用断路器模式将运行缓慢的组件与其他组件隔开、如何用事务序列(Saga)模式实现多阶段事务以及如何通过分片模式来划分数据集,分析如何保持源代码的可读性以及系统的可测试性(即使在存在许多潜在交互和失败点的情况下)。 主要内容 ? “反应式宣言”指南 ? 流量控制、有界一致性、容错等模式 ? 得之不易的关于“什么行不通”的经验 ? ......一起来看看 《反应式设计模式》 这本书的介绍吧!
CSS 压缩/解压工具
在线压缩/解压 CSS 代码
在线进制转换器
各进制数互转换器