5

このサイトの他のスレッドを読んでいると、dynamic_cast と static_cast の両方がアップキャストに対して安全であることが言及されています。

これらがアップキャストに必要なのはなぜですか?

たとえば、クラス B が A から派生した場合、

A * ptr = new B ();

引き続き動作し、タイプ A のオブジェクトのように動作します (私は、アップキャストの変換が不要な Java バックグラウンドの出身でもあります。

また、このサイトで、ダウンキャストには dynamic_cast は必要ないことを読みました [質問 " static_cast、dynamic_cast、const_cast、および reinterpret_cast はいつ使用する必要がありますか? "] 。繰り返しますが、アップキャストは自動的に行われるため、ダウンキャストの場合にのみキャストが本当に必要になると思います。

どこが間違っていますか?

4

3 に答える 3

1

多重継承 (Java には実際にはありません) の場合、「this」ポインターを調整する可能性があります。その場合、reinterpret_cast は安全ではありません。これは、static_cast と dynamic_cast が安全であると言って強調しようとしていることです。

ちょっとしたメモとして、Android-without-dynamic_cast に移植されるコードベースの調査で、127 個の dynamic_cast が見つかりました。そのうち 122 個は実際には必要ありませんでした。これは、C++ に非常に精通している人々によって書かれたコードです。

于 2013-04-29T18:55:09.633 に答える
0

これらがアップキャストに必要なのはなぜですか?

それらはそうではなく、アップキャストに使用するのは (IMHO) 誤解を招きます:理由によりキャストは必要ありません: 論理的には、サブクラス オブジェクトはスーパークラスのインスタンスです。

要約すると、明示的なアップキャストはお勧めできません。私が少なくとも一貫性を要求すると主張する人々のために: 初期化を含め、あらゆる場所で明示的なアップキャストを使用してください:

A * ptr{static_cast<A*>(new B)};

ほとんどの人は、これはばかげていることに同意するでしょう。

于 2013-04-29T18:54:44.110 に答える