将对象(不是指针)向下转换为已知的派生类型是否安全?

Joh*_*ohn 3 c++ downcast object-slicing

会有切片的危险吗?

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

哪里

class Block : Object {/*Filler*/}
Run Code Online (Sandbox Code Playgroud)

obj1obj2放心是Block对象?

我很想用:

    cmp = ((const Block*)&obj1)->NumSuperBlocks() - ((const Block*)&obj2)->NumSuperBlocks();
Run Code Online (Sandbox Code Playgroud)

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

Ben*_*igt 7

引用和指针都是多态的.

你可能更喜欢

static_cast<const Block&>(obj1).NumSuperBlocks()
Run Code Online (Sandbox Code Playgroud)

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