2017-10-16 6 views
3

C++で仮想デスプーラを作成せずに非ポリモーフィックベースクラスのポインタ/参照をダウンキャストできますか?ノンポリモフィックベースクラスのダウンキャスト方法

+0

はい*可能かもしれませんが、あなたは 'static_cast'または' reinterpret_cast'を使う必要があります。 *ただし*、基本クラスが多相でなく、仮想デストラクタを持たない場合、おそらくそれを継承するのは正しい選択ではありません。基本クラスを* member *として代わりに持つべきでしょうか?解決したい*実際の問題は何ですか? *なぜ*あなたは継承を使用していますか? –

+0

だから、私の基本クラスが非多型(仮想メソッド/デストラクタなし)であれば、私はダウンキャストできないと言うのは正しいですか? – Adrika

+0

'dynamic_cast'を使うとできません。 –

答えて

1

仮想デストラクタはダウンキャストとはほとんど関係がありません。デストラクタを仮想的にする目的は、ポインタを基に安全に削除できるようにすることです。

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を使用するには多態型が必要です。

+0

non-polymorphic型の 'dynamic_cast'ダウンキャストが不正です。 – Oktalist

+0

これは私が標準での言葉の理解に問題があることを意味します。彼らがこのセクションで使用するように、 "vにはcv2 Dへの型ポインタ"があり、このセクションでは、指摘されたオブジェクトのタイプと表現のタイプを区別することが重要です。しかし、ideoneは非多型表現型を拒絶するので、正しいです。 –

関連する問題