[セットトップ]static_cast | dynamic_cast | const_cast | reinterpret_cast



C++4種類の強制型変換:
static_cast静的タイプ変換
一般的にはintなどの一般的なデータ型
dynamic_cast            
ダイナミックタイプ変換
一般的に、親と子のポインタまたは適用の相互変換に使用されます. 
const_キャストはconstの性質の変換を取り除く
reinterpret_cast        
タイプ変換の再解釈--マシンに依存し、移植性が悪い
static_castとdynamic_castはポインタからポインタへの変換、またはインスタンス自体からインスタンス自体への変換を実行できますが、
インスタンスとポインタの間で変換できません.
static_castはコンパイル時のタイプセキュリティしか提供できませんがdynamic_castは、ランタイムタイプのセキュリティを提供します.
マルチステートプログラミングを適用する場合、渡されたオブジェクトの実際のタイプを特定できない場合はdynamic_を使用します.cast,オブジェクトの実際のタイプを保証できるならstatic_castでいいです.
static_cast  
コンパイル時のタイプセキュリティのみが提供されます.
変換のセキュリティを保証するランタイムタイプチェックはありません.
主に次のような使い方があります.
①クラス階層内のベースクラスとサブクラス間のポインタまたは参照の変換に使用します.
上り変換(サブクラスのポインタや参照をベースクラス表示に変換)を行うのは安全です.
下り変換(ベースクラスポインタや参照をサブクラス表示に変換)を行う場合、ダイナミックタイプチェックがないため安全ではありません.
②intをcharに変換し、intをenumに変換するなど、基本データ型間の変換に使用します.このような転換の安全性も開発者が保証しなければならない.
③空ポインタをターゲットタイプの空ポインタに変換します.
④任意のタイプの式をvoidタイプに変換します.
dynamic_cast < type-id > ( expression )
type-idは、クラスのポインタ、クラスの参照、またはvoid*でなければなりません.
type-idがクラスポインタタイプの場合、expressionもポインタでなければなりません.type-idが参照の場合、expressionも参照でなければなりません.
主にクラス階層間の上り変換と下り変換に使用され、クラス間の交差変換にも使用されます.
クラス階層間で上り(派生トランスベースクラス)変換を行う場合、dynamic_castとstatic_castの効果は同じです.
下り変換時にdynamic_castにはタイプチェックの機能があり、
比static_castの方が安全です.
class B{
public :
       int m_iNum;
       virtual  void foo();
};

class D : public B{
    public :
       char  *m_szName[ 100];
};
 
void func(B  *pb){
    D  *pd1  = static_cast <* >(pb);
    D  *pd2  = dynamic_cast <* >(pb);
}
        , pb Dpd1 pd2 , D
, pb B , pd1 , D ( m_szName),
pd2 ( )。
 
:B , ;static_cast 。

dynamic_cast (crosscast)
class A{
public :
        int m_iNum;
        virtual  void f(){}
};
 
class B : public A{
};
 
class D : public A{
};
 
void foo(){
    B  *pb  = newB;
    pb - >m_iNum  =  100;
 
    D  *pd1  = static_cast <D * >(pb);    //compile error
    D  *pd2  = dynamic_cast <* >(pb);   //pd2 is NULL
     delete pb;
}
foo , static_cast , ; dynamic_cast , 。

reinterpret_cast       32bit , 。 , , , ! 32bit 。
, 32bit , !  
int a  =  3;
int * p_int  = NULL;
double c  =  10. 1;
 
p_int  =  reinterpret_cast < int * >(a);  //ok
=  reinterpret_cast < int >(a);   //ok
=  reinterpret_cast < double >(a);  //error         int double