C++タイプ変換の考え方
class Base
{
public:
Base()
{
cout << "base create" << endl;
}
Base(const Base& b)
{
*this = b;
cout << "base copy create" << endl;
}
~Base()
{
cout << "base destroy" << endl;
}
virtual void run()
{
cout << "base run" << endl;
}
};
class CMy : public Base
{
public:
CMy()
{
cout << "cmy create" << endl;
}
~CMy()
{
cout << "cmy destroy" << endl;
}
void run()
{
cout << "cmy run" << endl;
}
};
int main()
{
CMy *p = new CMy();
//Base *bp = (Base *)p;
cout << "----------" << endl;
((Base *)p)->run();
cout << "----------" << endl;
(*((Base *)p)).run();
cout << "----------" << endl;
(*p).run();
cout << "----------" << endl;
//
(static_cast<Base>(*p)).run();
cout << "----------" << endl;
delete p;
return 0;
}
なぜ虚関数が上記のような状況で布団類の隠蔽に成功しなかったのかを考えることができます.このときのrunはC++コンパイラによって生成された一時オブジェクトBaseであり,このときのrunはサブクラスではなくBaseであるからである.
この行のコード:(static_cast
まとめ:
C++コンパイラはクラス(クラスのポインタではなく)を強制的に変換するときに一時オブジェクトを生成します.これはコンパイル時に決定されます.これはコンパイラに属する静的変換static_です.castは,構造関数の印刷をコピーすることによってこれを証明することができ,一時オブジェクトはスタックに存在するが,オーバーヘッドはまだあるので,クラスに対する強制変換をできるだけ少なく(実際にはしないことができる)行うことができる.