0.c++-static_cast、reinterpret_cast、dynamic_キャスト、等変換


static_cast:
C++に組み込まれた基本データ型間の相互変換が可能です.クラスに触れるとstatic_castは相互に関連するタイプでのみ相互変換でき,必ずしも虚関数を含まない
class A{};
class B:public A{};
class C{};
int main(){
	A* a=new A;
	B* b;
	C* c;
	b=static_cast<B>(a);  //       , B   A 
	c=static_cast<B>(a);  //     , C  A       
	return 1;
}</span>

const_cast: 
const_cast操作は異なる種類間で変換できません.逆に、1つの作用する式を定数に変換するだけです.本来constタイプではないデータをconstタイプに変換したり、constプロパティを削除したりすることができます.
reinterpret_cast: 
Cスタイルの強制転換と同じ能力を持っている.内蔵されたデータ型を他のデータ型に変換したり、ポインタ型を他のタイプに変換したりすることができます.組み込みのデータ型をポインタに変換することもでき、タイプのセキュリティや定数を考慮する必要はありません.やむを得ず絶対に使わない.
dynamic_cast: 
(1)他の3種類はコンパイル時に完了し、dynamic_castは実行時に処理され、実行時にはタイプチェックが行われる.(2)内蔵の基本データ型の強制変換には使用できない.(3)dynamic_cast変換が成功するとクラスへのポインタや参照が返され、変換に失敗するとNULLが返される.(4)dynamic_castを使用して変換する場合、ベースクラスには必ず虚関数があり、そうでなければコンパイルが通らない.虚関数がある原因を検出する必要がある:クラスに虚関数が存在する場合、ベースクラスポインタや参照を派生クラスオブジェクトに向けたい場合があることを示し、このとき変換するのが意味がある.虚関数が定義されているクラスのみ虚関数テーブルがある.(5)クラスの変換時にクラス階層間でアップコンバートを行う場合、dynamic_castとstatic_castの効果は同じです.ダウンコンバートを行う場合、dynamic_castは、static_castよりも安全なタイプチェック機能を持ちます.アップコンバートは、親ポインタから子ポインタに変換されます.ダウンコンバートが成功するかどうかは、変換するタイプにも関係します.つまり、変換する指です針が指すオブジェクトの実際のタイプは、変換後のオブジェクトタイプと同じでなければなりません.そうしないと、変換に失敗します.
class A{
	public:
	virtual void foo(){
		std::cout<<"A::foo"<<std::endl;
	}
};
 
class B{
	public:
	virtual void bar(){
		std::cout<<"B::bar"<<std::endl;
	}
};
 
class C : public A, public B{
	public:
	void foo(){
		std::cout<<"C::foo"<<std::endl;
	}
	void bar(){
		std::cout<<"C::bar"<<std::endl;
	}
};
 
int main(){
	A *a = new C;
	a->foo();
	B *b = dynamic_cast<B*>(a);
	b->bar();
	return 0;
}
</span>

結果:
C::foo C::bar