【发布时间】:2014-12-09 11:53:44
【问题描述】:
static_cast 是如何工作的?如果你正在做类似的事情......
如果 D 通过一些未指定的层次结构(不一定直接)从 B 继承,并且您这样做:
B* b = new D();
D* d = static_cast<D*>(b);
发生了什么?它只是在编译时计算偏移量并将该偏移量应用于指针吗?还是在运行时发生了什么事情才能进行演员表?
【问题讨论】:
-
static_cast总是使用编译时类型信息解析。 (这可能涉及运行时操作)。如果它不是一个合适的演员,你要么得到一个编译错误或未定义的行为。在您的 sn-p 中可以,因为b是D;但是,如果b是new B(),则转换编译但如果运行会导致未定义的行为。 -
是的,它只是在编译时计算偏移量并添加它。除非有多重继承和/或虚拟继承(或者你有一个非常奇怪的编译器),否则偏移量无论如何都会为 0,所以实际上不会发出额外的代码。
-
参见 Effective C++ Item 27 Minimize Casting。
标签: c++ casting static-cast