c++ - c++中static_cast是如何实现的?

标签 c++ casting static-cast

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/

相关文章:

c++ - 如何将整数变量转换为 QTime 对象

c++ - 为什么底层类型为 int8_t 的 static_cast 枚举类会得到意外的值?

c++ - 从堆栈弹出值

c++ - Qt 在不相关的对象之间传递变量

javascript - 对象可能是 'undefined'

sql - Postgres : How to store bytea as value in hstore?

c++ - 在 static_cast 和dynamic_cast 之间自动选择以获得最佳性能

c++ - 来自类型 <未解析的重载函数类型> 的无效 static_cast

c++ - 使用 MinGW 的 -j(作业)选项构建 wxWidgets 时出错

c++ - 在这种情况下我需要 "Default"语句吗?