32. dynamic_cast
実行時にキャストが行われる
class A{virtual void boo(){};};
class B : public A{};
class C{virtual void boo(){};};
B bb;
A *a = dynamic_cast<A*>(&bb);
B *b = dynamic_cast<B*>(a);
C *c = dynamic_cast<C*>(a);
B*からA*へのアップキャストは安全
A*からB*へのダウンキャストは危険をともなう場合がある
A*からC*は継承関係がないのでエラー値 nullが返って来る
なるべく使わないcast
38. explicit
class A{
public:
A( int n ){cout << "construct " << n << endl; };
};
auto main() -> int {
[](const A &a){}(2);
return 1;
};
const A& の引数を期待しているが intで渡せる
暗黙的型変換により intから class Aが 暗黙的に生成されている!!
一般的には、明示的な型変換しか受け付けないほうが良い
暗黙的型変換を想定していない場合は 禁止すべきだ
39. explicit
class A{
public:
explicit A( int n ){};
};
と、explicitを使えば暗黙的型変換はコンパイルエ
ラーになる
もちろん、明示的にキャストすればOK
[](const A &a){}(static_cast<A>(2));
特別な意図がないかぎりは、型変換コンストラク
タは explicitするべき
46. スコープ
int A;
enum hoge{
A, // int Aとシンボルがぶつかりエラー
B
};
enum class hoge2{
A, // スコープを持つのでかぶらない
B
};
以前のenumは、スコープを持たないため、他のシンボ
ルとかぶる為、namespaceを付けたり、サフィックスを
つけてたが
enum classでは独自スコープを持つため 問題ない
47. 暗黙的型変換
enum class hoge {
A, B
};
int a = hoge::A; // コンパイルエラー
enumではintへの暗黙的型変換は許可されているが
enum class では許可されない
static_castで内部型に明示的にキャストする
// enum classの内部型
using hoge_t = std::underlying_type<hoge>::type ;
hoge_t a = static_cast<hoge_t>(hoge::A);