static_cast
是如何工作的?如果您正在做类似...
如果 D 通过某种未指定的层次结构(不一定是直接继承)继承自 B,而您这样做:
B* b = new D();
D* d = static_cast<D*>(b);
这是怎么回事?它只是在编译时计算一个偏移量并将该偏移量应用于指针吗?或者在运行时是否发生了一些事情来进行转换?
最佳答案
what is happening?
编译器假设你知道你在做什么,所以指针确实指向一个D
对象,并相应地改变指针类型,必要时调整值指向完整的 D
对象而不是 B
子对象。
如果你弄错了,并且使用了一个没有真正指向一个D
对象的D*
指针,那么你会得到未定义的行为;所以要小心。
Is it simply calculating an offset at compile time and applying that offset to the pointer?
是的。
Or is there something happening at runtime in order to do the cast?
没有; “静态”意味着它只使用编译时信息。唯一的运行时事件是在必要时添加固定偏移量。
如果您希望运行时检查转换是否有效(只要类型是多态的),请使用dynamic_cast
。如果那里真的没有 D
对象,它会给出一个空指针(或者如果你正在转换一个引用而不是一个指针,则抛出一个 bad_cast
异常)。
关于c++ - c++中static_cast是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27378349/