15

我很高兴在我的代码中使用 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无论对其进行多少次强制转换,它的值都保持不变,但这种想法是否正确?

4

4 回答 4

27

转换后的指针可以指向另一个位置。例如,在多重继承的情况下。好读

原始指针将被保留

于 2012-07-25T14:37:23.347 回答
5

在任何情况下,强制转换都不会改变它的操作数。它所做的只是改变编译器如何看待操作数。

的值pC不会改变;强制转换的结果可能是相同的值但类型不同(例如,在 aconst_cast或 a的情况下reinterpret_cast),或者它实际上可能既是不同的类型是不同的值(例如,static_cast在 a 的情况下,在多重继承的情况下) ,见安德鲁的回答)。

要真正了解在哪些情况下会发生不同的结果值,您必须阅读 C++ ABI,即对象如何准确地存储在内存中。

于 2012-07-25T14:36:43.020 回答
4

在您的情况下,它不会更改指针。

但是对于多重继承,它必须改变指针。

您可以编写一个示例程序来确认这一点。

于 2012-07-25T14:39:36.437 回答
-2

简短的回答:

使用强制转换,您只需告诉编译器如何解释一个对象,即我应该认为该对象是什么类型。

强制转换不会改变对象的值。

于 2012-07-25T14:40:48.307 回答