C++の基礎 - キャスト
ナビゲーションに移動
検索に移動
static_cast
ある型からある型への暗黙の変換が存在する時(例 : int型からdouble型へ変換)、そこで暗黙の変換が行われることを明示する場合に使用する。
double d = 3.14;
int i = static_cast<int>(d);
dynamic_cast
親クラスのポインタを子クラスのポインタにキャストする時に使用する。
その際、その親クラスのポインタが指すオブジェクトの実体が、キャスト先のクラスであることを確認する。
ポインタが指す実体が、キャスト先のクラスまたはその子孫クラスである場合はポインタはそのまま使われるが、
キャスト先のクラスとして使用できない場合には、NULL(nullptr)に置き換えられる。
Child0 child00;
Parent* parent = &child0;
// Child1* child1 = parent; <- コンパイルエラー
// child1はchild1にキャストされる
Child1* child01 = dynamic_cast<Child1*>(parent);
std::cout << "child1 : " << child1 << std::endl;
std::cout << "child1->name() : " << child1->name() << std::endl;
// child2はnullptrとなる
Child2* child2 = dynamic_cast<Child2*>(parent);
std::cout << "child2 : " << child2 << std::endl;
dynamic_castを行うためには、型情報がポインタから得られる必要がある。
つまり、クラスはポリモーフィックである必要がある。
親クラスは最低でも1つのvirtualな関数が親クラスに定義されていて、vtableが存在しなくてはならない。
reinterpret_cast
ポインタ型を他のポインタ型に強制的に変換する。
dynamic_castと違うのは、ポインタの型変換が安全に行えるかは考慮されない。
また、整数型(int、long、long long等)を任意の型のポインタに変換するのにも利用できる。
int i;
char *c = reinterpret_cast<char*>(&i);
c[0] = 1;
c[1] = 1;
// 257 in little-endian.
std::cout << "i : " << i << std::endl;
long addrint = reinterpret_cast<long>(c);
std::cout << "addrint : " << addrint << std::endl;
const_cast
constを付加するまたは外す時に使用する。
C++ではconst_castを使用してconstを外すことができるが、constは変数を定数として扱うことを表しているので、解除するのは問題がある。
互換性の問題でどうしても使わざるを得ない場合以外では使うべきではない。