为什么强制转换对象不更改其地址?有关对象类型的信息存储在哪里?

时间:2019-06-12 14:58:25

标签: c++ casting

我刚刚使用qobject_cast进行了测试(但我想对于任何其他类型的类型转换都一样),显然将对象转换为其他类型不会改变其地址。这使我认为有关对象类型的信息存储在其他地方...对吗?

我还是C ++的新手,所以如果这毫无意义,也请随时告诉我。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:3)

  

为什么类型转换对象不会更改其地址?

因为类型转换对源对象 1 的影响绝对为零。类型转换始终会产生一个新对象(可能具有不同的类型)或引用。此外,没有任何操作可以更改任何对象的地址。一个对象在整个生命周期中都存储在一个地址中。

如果类型转换的结果是引用,则该引用可能引用其他地址中的另一个对象,尤其是在转换为对相同继承层次结构中的类型的引用时。

1 从技术上讲,转换构造函数或转换运算符可以修改源对象,但这绝对是非常规的。

  

有关对象类型的信息存储在哪里?

类型信息由编译器在编译程序时“存储”。在 general 中,信息不需要由程序本身存储。

在多态类型的特殊情况下,一些有关对象类型的信息存储在程序的内存中,以支持dynamic_cast和动态typeid。它存储在语言实现选择适当的任何位置。

  

我刚刚使用qobject_cast对此进行了测试

在C ++中没有qobject_cast这样的东西。也许您正在使用某些库。

答案 1 :(得分:1)

在某些情况下,类型转换实际上确实会更改源对象的表观地址。原始源对象的地址不变,但是如果通过{{1}强制转换了对象,引用或指向派生类的指针,则“该相同对象”(不是新构造的转换对象)的地址可能会有所不同。 }或static_cast指向基类的引用或指针时,派生类继承多继承层次结构中的基类,并且基类包含数据或是多态的(或两者都有)。 “不同地址”实际上是整个派生类的基类部分所在的源对象内的地址。