は、だから私はのdynamic_cast、C-スタイルキャスト、static_castをの違いについてを少し多くを学ぶためにしようとしていると私は決めた作品Cスタイルキャストの違いを反映するこの例を試してみてください。とstatic_castかなり良いです。メソッドの呼び出しが
class B
{
public:
void hi() { cout << "hello" << endl; }
};
class D: public B {};
class A {};
int main()
{
A* a = new A();
B* b = (B*)a;
b->hi();
}
さて、このコードスニペットは、非常にうまくいかないと悪いキャストが全く検出されないCスタイルキャストことを反映すべきです。部分的にはそれが起こります。悪いキャストは検出されませんが、プログラムがb->hi();
でクラッシュする代わりに、画面に "hello"という単語が表示されたときに驚いていました。
これはどうしてですか? Bオブジェクトがインスタンス化されていないときに、そのようなメソッドを呼び出すために使用されたオブジェクトは何ですか?私はg ++を使ってコンパイルしています。
このような無関係な型へのキャスト(C++で 'reinterpret_cast'は効果的に何が行われますか)は未定義の動作です。これは、実装が望みどおりに行うことができることを意味します。 – Yuushi
ヒント:壊れた時計でさえ、1日に2回、適切な時間を示します。 –
Cスタイルのキャストは、コンパイラに 'これはBオブジェクトであると信じている'と伝えるプログラマーのようなものです。コンパイラは黙認する以外に選択肢はありません。実行時に何が起こるかは定義されていません。これはまさにCスタイルのキャストがとても危険な理由です。 –