3

会不会有切片的危险

result Compare(const Osp::Base::Object &obj1, const Osp::Base::Object &obj2, int &cmp) const {
    cmp = ((const Block)obj1).NumSuperBlocks() - ((const Block)obj2).NumSuperBlocks();
}

在哪里

class Block : Object {/*Filler*/}

并且obj1确定obj2Block对象?

我很想使用:

    cmp = ((const Block*)&obj1)->NumSuperBlocks() - ((const Block*)&obj2)->NumSuperBlocks();

但是在阅读 SO 对对象切片标签的简要描述时,我很想使用前者。但我真的不想要任何讨厌的无声切片。

4

2 回答 2

9

引用和指针都是多态的。

你可能更喜欢

static_cast<const Block&>(obj1).NumSuperBlocks()

对于从引用开始的向下转换,它相当于*static_cast<const Block*>(&obj1).

于 2012-02-14T19:30:09.243 回答
1

首先,不要使用 C 风格的演员表进行向下转换(或任何转换)。这是非常危险的,因为它绕过了所有编译器检查。

也就是说,当您向下转换引用或指针时,您无需担心切片。

对于多态对象(即具有虚拟方法的对象),您可以使用动态转换,它为您提供编译时 + 运行时检查(向下转换指向错误类型的指针时返回 null,或者在向下转换对错误的引用时抛出 bad_cast 异常类型):

Block & block = dynamic_cast<Block&>(obj);

对于非多态对象,您可以使用static_cast.

于 2012-02-14T19:31:29.327 回答