如何在 c++ 中实现static_cast

How is static_cast implemented in c++?

本文关键字:static cast 实现 c++      更新时间:2023-10-16

static_cast如何工作?如果你正在做这样的事情...

如果 D 通过某个未指定的层次结构(不一定是直接(从 B 继承,并且您这样做:

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

发生了什么事情?它是否只是在编译时计算偏移并将该偏移量应用于指针?还是在运行时发生了一些事情来做演员表?

发生了什么事情?

编译器假定您知道自己在做什么,因此指针确实指向D对象,并相应地更改指针类型,必要时调整值以指向完整的D对象而不是B子对象。

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

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

是的。

还是在运行时发生了一些事情来做演员表?

不;"静态"意味着它仅使用编译时信息。唯一的运行时活动是在必要时添加固定偏移量。

如果要在运行时检查转换是否有效(只要类型是多态的(,请使用 dynamic_cast。如果那里没有真正的D对象,它将提供一个空指针(或者如果你正在转换引用而不是指针,则会引发bad_cast异常(。