C++样式转换运算符是否会更改它所转换的指针?

mat*_*975 13 c++ inheritance pointers casting type-conversion

我很高兴在我的代码中使用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?
Run Code Online (Sandbox Code Playgroud)

我意识到指向的对象pC总是类型,C但在第一次转换后,我假设存储的地址b不再等于pC.但如果演员改变了pC我的假设的价值是错误的.简而言之,强制转换操作符实际上是否可以更改它们所投射的指针的地址?这似乎是一个非常简单的问题,但在我看来,图片并不清楚如何将具有继承层次结构的对象存储在内存中以及如何通过强制转换操纵指针.

在我的脑海中,pC无论对其进行多少演员表,其价值都保持不变,但这种想法是否正确?

And*_*rew 24

铸造指针可以指向另一个位置.例如,在多重继承的情况下.好读

原始指针将被保留

  • +1这是一个关于ideone的[link](http://ideone.com/UkRKM)来证明这一点. (3认同)

Dev*_*lar 6

在任何情况下,演员都不会改变其操作数.它所做的只是改变编译器看到操作数的方式.

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

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


小智 6

在你的情况下,它不会改变指针。

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

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