如何在c ++中实现static_cast?

dan*_*dan 2 c++ casting static-cast

static_cast工作怎么样?如果你做的事......

如果D通过某些未指定的层次结构(不一定是直接)从B继承,并且您执行以下操作:

B* b = new D();
D* d = static_cast<D*>(b);
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*our 5

怎么了?

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

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

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

是.

或者是否有一些事情在运行时发生以进行演员表?

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

使用dynamic_cast,如果你想有一个运行时检查,转换是有效的(只要类型是多态).bad_cast如果没有真正的D对象,它将给出一个空指针(如果你正在转换引用而不是指针则抛出异常).