如何在c ++中实现static_cast?

时间:2014-12-09 11:53:45

标签: c++ casting static-cast

static_cast如何运作?如果您正在做类似的事情......

如果D通过某些未指定的层次结构(不一定是直接)从B继承,那么你会这样做:

B* b = new D();
D* d = static_cast<D*>(b);

发生了什么事?它只是在编译时计算偏移量并将该偏移量应用于指针吗?或者是否在运行时发生了某些事情以进行演员表?

1 个答案:

答案 0 :(得分:5)

  

发生了什么事?

编译器假定您知道自己在做什么,以便指针确实指向D对象,并相应地更改指针类型,如果需要调整值以指​​向完整的{{ 1}}对象而不是D子对象。

如果你弄错了,并使用一个并不真正指向B对象的D*指针,那么你将得到未定义的行为;所以要小心。

  

是否只是在编译时计算偏移量并将该偏移量应用于指针?

  

或者是否在运行时发生了什么事情才能进行演员表?

没有; “static”表示它仅使用编译时信息。唯一的运行时活动是在必要时添加固定偏移量。

如果您希望运行时检查转换是否有效(只要类型是多态的),请使用D。它会给出一个空指针(如果你正在构建一个引用而不是一个指针,则抛出一个dynamic_cast异常)如果那里没有一个bad_cast对象。