C++で仮想デスプーラを作成せずに非ポリモーフィックベースクラスのポインタ/参照をダウンキャストできますか?ノンポリモフィックベースクラスのダウンキャスト方法
答えて
仮想デストラクタはダウンキャストとはほとんど関係がありません。デストラクタを仮想的にする目的は、ポインタを基に安全に削除できるようにすることです。
Base * ptr = new Derived;
delete ptr; // undefined behavior if Base destructor isn't virtual
ダウンキャストは、ご自身の責任で、static_cast
を使用して行うことができる
void processBase(Base * ptr)
{
// undefined behavior if ptr does not point to Derived
// object or some object that inherits from Derived
Derived * derived = static_cast<Derived *>(ptr);
}
もダウンキャストが合法であるかどうかをチェックしますdynamic_cast
ありますが、それはに表現ポイントをキャストする必要があり(または参照)多相オブジェクト(すなわち、少なくとも1つの仮想関数が宣言または継承されているオブジェクト)。
5.2.7.6そうでない場合、Vは、キャスト式の種類が多型ではない場合、プログラムはコンパイルに失敗へのポインタまたは多相型の左辺値(10.3)
なければなりません。
要約すると、destructor virtualはクラスを多相にしますが、他の仮想メンバ関数を宣言することによっても同じことが達成されます。 dynamic_cast
を使用するには多態型が必要です。
non-polymorphic型の 'dynamic_cast'ダウンキャストが不正です。 – Oktalist
これは私が標準での言葉の理解に問題があることを意味します。彼らがこのセクションで使用するように、 "vにはcv2 Dへの型ポインタ"があり、このセクションでは、指摘されたオブジェクトのタイプと表現のタイプを区別することが重要です。しかし、ideoneは非多型表現型を拒絶するので、正しいです。 –
- 1. c#オブジェクトをダウンキャストする方法
- 2. Cでのダウンキャスト
- 3. 型キャスト/ Javaのダウンキャスト
- 4. Java - アップキャスティングとダウンキャスト
- 5. これを基本クラスにダウンキャストする方法は?
- 6. ハッシュテーブルを抽象クラスオブジェクトにダウンキャストする方法
- 7. FakeRequestをRequestHeaderにダウンキャスト
- 8. ダウンキャスト型を返す
- 9. 整数ランタイムエラーにObjectからダウンキャスト:私はダウンキャスト理解java.lang.ClassCastExceptionが
- 10. F#DataTableの要素をダウンキャスト
- 11. C++リファレンスキャストのオーバーロード(ダウンキャスト継承)
- 12. フェイク:DbConnectionへのダウンキャストSqlConnection
- 13. ダウンキャストに関する問題
- 14. アップキャストおよびダウンキャストは、
- 15. MongoDb抽象コレクションとダウンキャスト
- 16. Typescriptでダウンキャストするには?
- 17. 効率的なダウンキャストstd :: shared_ptr
- 18. メンバ関数へのポインタのダウンキャスト
- 19. ダウンキャストの代わりにコンストラクタのベースオブジェクト
- 20. ダウンキャストの明確化が必要
- 21. 借用されたボックスのダウンキャスト
- 22. Javaはカスタムクラスの拡張日にダウンキャスト - ランタイムエラー
- 23. ダウンキャスト配列の長さとインデックス
- 24. Consumeメソッドで受信したメッセージのダウンキャスト
- 25. ダウンキャストのない多型設計
- 26. Typescript: "this"のダウンキャストはできません
- 27. javaでダウンキャストが可能な場合
- 28. 必要時にダウンキャストするには?
- 29. テンプレート派生型にベースポインタからダウンキャスト
- 30. SQL - 安全にダウンキャストBIGINT INTに
はい*可能かもしれませんが、あなたは 'static_cast'または' reinterpret_cast'を使う必要があります。 *ただし*、基本クラスが多相でなく、仮想デストラクタを持たない場合、おそらくそれを継承するのは正しい選択ではありません。基本クラスを* member *として代わりに持つべきでしょうか?解決したい*実際の問題は何ですか? *なぜ*あなたは継承を使用していますか? –
だから、私の基本クラスが非多型(仮想メソッド/デストラクタなし)であれば、私はダウンキャストできないと言うのは正しいですか? – Adrika
'dynamic_cast'を使うとできません。 –