如果我们使用多重继承,切片会使父对象的地址与地址对象不同:
struct X {int x};
struct Y {int y};
struct Z : X, Y {int z};
因此,如果我们有Z
个对象z
,则其地址&z
将不与其Y
父级的地址重合:{ {1}}比static_cast<Y*>(&z)
高四个字节。
关于&z
的好处是,它是静态的,因此不占用运行时间(与static_cast
相比,即)。
但是,如果我们的dynamic_cast
指向Z*
,那么每次转换为父级都应并且也会产生空指针。
为什么这样做以及如何实施?这是否意味着每个0
都引入了分支指令?
答案 0 :(得分:7)
是的,从指向派生类的指针到指向基类的指针和static_cast
的隐式转换都必须保留空指针值。这意味着在生成的代码中,对于多个继承情况,通常需要一个分支,其中基类地址与派生类地址不一致。
理论上,实现可以在“零”地址周围保留一系列地址来表示空指针,并避免在这种情况下使用分支,但这会以增加额外检查来进行空指针比较为代价。 / p>