C++0X/11 でスマート ポインターを使い始めたところ、奇妙な状況に遭遇しました。shared_ptr を使用してオブジェクトのインスタンスをアップキャストしたいと考えています。
クラス Extend はクラス Base から継承します。ここで、Base クラスには多態性を持たせるための仮想デストラクタがあります (それ以外の場合、dynamic_pointer_cast は非多態性クラスのキャストについて文句を言います)。
したがって:
std::shared_ptr<Base> obj = std::make_shared<Base>();
そして、私は:
obj = std::dynamic_pointer_cast<Extend>(obj);
- 安全ですか?
- オブジェクトへの他のポインターはどうなりますか? obj だけがそれを Extend として扱いますが、他の共有ポインタは引き続き Base として扱いますか?
- 同じインスタンスをアップキャストしても安全ですか、それとも何か他のことをする必要がありますか?
編集:答えてくれてありがとう。私がこの質問をした本当の理由は、SAX パーサーを使用して XML ドキュメントを処理することでしたが、アップ/ダウン キャストに夢中になりました。私が欲しかったのは:
std::shared_ptr<Extend> ex = std::dynamic_pointer_cast<Extend>(obj);
obj = ex;
しかし、それはまったく意味がありません。代わりに、オブジェクト ファクトリを使用します。