動的キャスト
ここでは、
?@ 「派生クラスへのポインタ」から「基底クラスへのポインタ」への型変換(アップキャスト)
?A 「派生クラスへの参照」から「基底クラスの参照」への型変換(アップキャスト)
についてチェックします。
dynamic_cast演算子
dynamic_cast演算子は、多相的クラスの動的キャストを行う演算子です。
◆キャストに失敗した際の、dynamic_cast演算子の挙動
?@ ポインタの場合
キャストにより生成されるポインタは、変換先の型をもつ 空ポインタとなります。
?A 参照の場合
例外 bad_cast
// ------------------------------------
#include <iostream>
using namespace std;
class Base {
public:
virtual ~Base() { }
// Base を多相的クラスにするために virtual
// を付けました。
};
class Derived : public Base { };
int main()
{
Base b;
Derived d;
/* ダウンキャスト(ポインタ) */
cout
<< "Derived* p1 = dynamic_cast<Derived*>(&b);\n";
Derived* p1 = dynamic_cast<Derived*>(&b);
cout << "&b … " << &b << '\n';
cout << "p1 … " << p1 << "\n\n";
/* アップキャスト(ポインタ) */
cout
<< "Base* p2 = dynamic_cast<Base*>(&d);\n";
Base* p2 = dynamic_cast<Base*>(&d);
cout << "&d … " << &d << '\n';
cout << "p2 … " << p2 << "\n\n";
/* ダウンキャスト(参照) */
cout
<< "Derived& r1 = dynamic_cast<Derived&>(b);\n";
try {
Derived& r1 = dynamic_cast<Derived&>(b);
cout << "成功\n\n";
}
catch (bad_cast e) {
cout << e.what() << "\n\n";
// bad_castクラスのメンバ関数 what()
}
/* アップキャスト(参照) */
cout
<< "Base& r2 = dynamic_cast<Base&>(d);\n";
try {
Base& r2 = dynamic_cast<Base&>(d);
cout << "成功\n";
}
catch (bad_cast e) {
cout << e.what() << '\n';
}
}
// ------------------------------------