【发布时间】:2012-06-09 14:27:06
【问题描述】:
如果我们使用多重继承,切片将使父对象的地址与叶对象的地址不同:
struct X {int x};
struct Y {int y};
struct Z : X, Y {int z};
所以如果我们有一个Z 对象z,它的地址&z 将不与其父Y 的地址重合:static_cast<Y*>(&z) 比@ 高四个字节987654327@.
static_cast 的好处在于它是静态的,因此不占用运行时间(与 dynamic_cast 相比)。
但是,如果我们有一个指向0 的Z*,那么每次转换到父级时都应该并且确实 产生一个空指针。
为什么这个工作以及它是如何实施的?这是否意味着每个static_cast 都会引入一个分支指令?
【问题讨论】:
-
这是可行的,因为
Z类型的每个对象也是Y类型的对象。基类的指针可以隐式指向派生类的对象。 -
@Als:我说的是
static_cast的实现。当然每个Z都包含一个Y,但它们的地址不同。但是,您可能会注意到static_cast<Y*>(zPtr)将0如果zPtr是0。 -
“它是静态的,所以不占用运行时间”——嗯?您确实意识到
static_cast也可以在不同大小的整数之间进行转换,不是吗?这也不是(通常)在运行时无操作。 -
@hvd:啊,是的。我在想“与需要 rtti 的
dynamic_cast相比”。 -
啊,这清楚了。但是
dynamic_cast并不总是需要 RTTI:至少在 GCC 中,dynamic_cast<void*>甚至可以与fno-rtti一起使用。
标签: c++ casting null static-cast object-slicing