派生クラスのダブル ポインターから基底クラスのダブル ポインターへの変換: 匿名性と安全性
C では、派生クラスへのポインターを暗黙的に変換できます。これは、継承ベースのプログラミングに便利な機能です。ただし、ダブル ポインターに関しては、この暗黙的な変換により安全性に関する懸念がいくつか生じます。
次のコードを考えてみましょう。
<code class="cpp">class Base { }; class Child : public Base { }; int main() { // Convert child to base (no problem) Child *c = new Child(); Base *b = c; // Convert double pointer to child to double pointer to base (error) Child **cc = &c; Base **bb = cc; // error: invalid conversion from ‘Child**’ to ‘Base**’ }</code>
GCC は、最後の代入ステートメントについて正当に文句を言います。 Child** から Base** への接続は暗黙的に許可されません。これは、これらのポインターの性質の根本的な違いによるものです。
Child** が暗黙的に Base** に変換できるようにすると、この区別に違反し、潜在的な安全上の問題が発生します:
<code class="cpp">// After explicit cast *bb = new Base; // Child pointer now points to a Base!</code>
これにより、オブジェクトのスライスが発生し、子固有のデータが失われ、整合性が損なわれる可能性があります。型の安全性を維持するために、Child** と Base** の間の変換は明示的に禁止されています。
代替キャスト オプション
暗黙的なキャストはサポートされていませんが、代わりのキャスト オプションがあります派生クラスと基本クラスのダブル ポインター間の相互変換を可能にするキャスト メソッド:
要約すると、派生クラスの double ポインターと基底クラスの double ポインターの間に暗黙的な変換がないため、潜在的な型安全性の問題が防止されます。必要に応じて、別のキャスト方法を慎重に使用し、仮想デストラクターを使用した動的キャストのクラス定義を変更することを検討してください。
以上がC で派生クラスの Double ポインターを基本クラスの Double ポインターに暗黙的に変換できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。