私は困惑するcスタイルのキャストがあるコードを見ています。
私はキャスティングにはかなり精通していますが、これは本当に理解できません。つまり、ここにあります: Base と Derived という 2 つのクラスがありますが、Derived はメソッド/属性を追加しません。基本的に、Base の属性の 1 つ (M_blockSize と呼びます) が 1 に固定されている場合は、Base の特定のケースにすぎません。ただし、特定の実装を必要とするメソッドはなく、機能の拡張もありません。そのような派生クラスの利点は、このスレッドのポイントではありません。開発者にはこれに正当な理由があると仮定しましょう。
とにかく、私が探しているコードでは、次のようなことが起こります。
void foo(const Derived& d){...}
[...]
Base b;
foo((Derived&) b);
そのため、開発者はベース オブジェクトを派生オブジェクトへの参照にキャストしました。私の理解では、「castee」(b) の具体的な型が実際に Derived である場合、ダウンキャストが行われます。ここではそうではありません。
ただし、これは c スタイルのキャストであるため、コンパイラは多数のキャストを試行しており、最終的にどのキャストが機能するかはわかりません。
だから、質問:
- 1) コンパイラはどのようなキャストを行っていますか? 私はおそらく reinterpret_cast を想定していますか?
- 2) static_cast< Derived& >(b) も同様に機能しますか?
- 3) クラス Derived がいくつかのメソッド/属性 (foo で使用されていない) を追加した場合、これはまだ機能しますか?
- 4) foo は、まだ Base にない Derived の機能を使用しないという重要なポイントはありますか?
質問が明確であることを願っています。ご協力ありがとうございました。