継承階層におけるポインター間の変換
次の C コードを考えてみましょう:
<code class="cpp">class Base { }; class Child : public Base { }; int main() { Child *c = new Child(); Base *b = c; // Allowed Child **cc = &c; Base **bb = cc; // Error: Conversion not allowed }</code>
変換制限の根拠
最後の行のコンパイラ エラーは、Child** から Base** への暗黙的な変換の制限を強調しています。この制限は、型の安全性を維持するために課されています。
この変換が許可されると、予期しない誤った状況が発生する可能性があります。たとえば、次のように書くことができます。
<code class="cpp">*bb = new Base;</code>
これにより、Base のインスタンスが作成され、そのアドレスが bb に格納され、c が指す元の Child* 参照が効果的に上書きされます。これにより、データの破損や予期しないプログラムの動作が発生する可能性があります。
暗黙的な変換の代替手段
を使用せずに Child** を Base** に暗黙的にキャストする直接的な方法はありません。 C スタイルまたは reinterpret_cast に依存する場合、型安全性を維持しながら目的の機能を実現する代替アプローチがあります。
以上がC の継承では「Child」から「Base」への暗黙的な変換が禁止されているのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。