我很高兴在我的代码中使用C ++样式的转换操作符,但我不能说我真正了解幕后发生的事情。我基本上想知道在以下短流程中指针实际发生了什么:
class A {};
class B : public A {};
class C : public B {};
A* pC = new C();
B* b = static_cast<B*>(pC); // Is the value of pC changed by the cast?
C* c = static_cast<B*>(pC); // Is the value of pC changed by the cast?
B* b2 = static_cast<B*>(c) // Is the value of c now equal to the value of b2?
我意识到pC
指向的对象始终是C
类型,但在第一次转换后,我假设存储在b
中的地址不再等于pC
的那个。但如果演员改变pC
的值,我的假设是错误的。简而言之,强制转换操作符实际上是否可以更改它们所投射的指针的地址?这似乎是一个非常简单的问题,但在我看来,图片并不清楚如何将具有继承层次结构的对象存储在内存中以及如何通过强制转换来操纵指针。
在我的脑海中,pC
的价值保持不变,无论对其进行了多少演员表,但这种想法是否正确?
答案 0 :(得分:23)
铸造指针可以指向另一个位置。例如,在多重继承的情况下。 Good read
原始指针将被保留
答案 1 :(得分:5)
在任何情况下,演员都不会更改其操作数。它所做的只是改变编译器看到操作数的方式。
pC
的值不会改变;演员的结果可能是相同的值但是类型不同(例如,在const_cast
或reinterpret_cast
的情况下),或者它实际上可能是不同的类型和一个不同的值(例如,在多重继承的情况下为static_cast
,请参阅Andrew的回答)。
要真正理解在哪种情况下会发生不同的结果值,您必须阅读C ++ ABI,即对象如何存储在内存中完全。
答案 2 :(得分:3)
在你的情况下,它不会改变指针。
但是对于多重继承,它必须改变指针。
您可以编写示例程序来确认。
答案 3 :(得分:-1)
简短回答:
使用强制转换,您只需告诉编译器如何解释对象,即我应该认为对象是什么类型。
强制转换不会更改对象的值。