c – vtable:基础算法

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

内容简介:翻译自: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


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

查看所有标签

猜你喜欢:

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

Google's PageRank and Beyond

Google's PageRank and Beyond

Amy N. Langville、Carl D. Meyer / Princeton University Press / 2006-7-23 / USD 57.50

Why doesn't your home page appear on the first page of search results, even when you query your own name? How do other web pages always appear at the top? What creates these powerful rankings? And how......一起来看看 《Google's PageRank and Beyond》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

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

在线XML、JSON转换工具

html转js在线工具
html转js在线工具

html转js在线工具