はオブジェクト(ポインタではない)を既知の派生型にダウンキャストしても安全ですか?
class Block : Object {/*Filler*/}
とobj1
とobj2
がBlock
オブジェクトであることを保証されてい
result Compare(const Osp::Base::Object &obj1, const Osp::Base::Object &obj2, int &cmp) const {
cmp = ((const Block)obj1).NumSuperBlocks() - ((const Block)obj2).NumSuperBlocks();
}
をスライスする危険性があるだろうか?
私が使用することを誘惑しています:
cmp = ((const Block*)&obj1)->NumSuperBlocks() - ((const Block*)&obj2)->NumSuperBlocks();
のが、読んでSOの元を使用するように私が誘惑していたオブジェクト・スライシングタグの簡単な説明です。しかし、私は本当に厄介な静かなスライスを望んでいません。
'const block 'は関数の引数が' const'です – Lol4t0
@BenVoigt:ポインタとオブジェクトはここでスライスしたのと同じような違いはありませんか? TBH、前者は*がなく、より読みやすく自然な感じです。 – John
@John:ここではポインタと参照の間に違いはありません。私は元のコードが嫌いです。それはスライスすることがあります。また、アクセス可能なコピーコンストラクタを必要とし、コピーで動作します。ここで参照またはポインタを使用します。 –