次のサンプルコードを検討してください。
#include <iostream>
using namespace std;
class base
{
public:
void func()
{
cout << "base::func()" << endl;
}
};
class derived : public base
{
public:
void func()
{
cout << "derived::func()" << endl;
}
};
void dummy(base *bptr)
{
derived *dptr = static_cast<derived*> (bptr);
dptr->func();
}
int main()
{
base bob1;
derived dob1;
dummy(&dob1); //Line1
dummy(&bob1); //Line2
}
dummy
1行目では、派生クラスオブジェクトのアドレスを、基本クラスオブジェクトへのポインタを受け取る関数に渡しています。したがって、static_cast
関数内dummy
は安全です。
Line2では、基本クラスオブジェクトのアドレスを関数に渡しています。したがって、static_cast
関数内dummy
は安全ではありません。
しかし、コードを実行すると、プログラムは正常に動作します。not safe
一言で言えば、プログラムは実行時にクラッシュするはずだと思いました。しかし、クラッシュは発生しませんでした。
これが私が得た出力です。
derived::func()
derived::func()
プログラムが実行時にクラッシュしなかった理由は何ですか?