static_cast
如何运作?如果您正在做类似的事情......
如果D通过某些未指定的层次结构(不一定是直接)从B继承,那么你会这样做:
B* b = new D();
D* d = static_cast<D*>(b);
发生了什么事?它只是在编译时计算偏移量并将该偏移量应用于指针吗?或者是否在运行时发生了某些事情以进行演员表?
答案 0 :(得分:5)
发生了什么事?
编译器假定您知道自己在做什么,以便指针确实指向D
对象,并相应地更改指针类型,如果需要调整值以指向完整的{{ 1}}对象而不是D
子对象。
如果你弄错了,并使用一个并不真正指向B
对象的D*
指针,那么你将得到未定义的行为;所以要小心。
是否只是在编译时计算偏移量并将该偏移量应用于指针?
是
或者是否在运行时发生了什么事情才能进行演员表?
没有; “static”表示它仅使用编译时信息。唯一的运行时活动是在必要时添加固定偏移量。
如果您希望运行时检查转换是否有效(只要类型是多态的),请使用D
。它会给出一个空指针(如果你正在构建一个引用而不是一个指针,则抛出一个dynamic_cast
异常)如果那里没有一个bad_cast
对象。