答えて
構造体は、スタック内(またはどこにいるかにかかわらず)に固定サイズのスロットを占有します。
したがって、派生した構造体のサイズが異なるため、構造体で多態性を行うことはできません。
メンバーを他の構造体から継承することは可能ですが、あなたはいかなる種類のポリンプライスも行うことができないので、混乱する価値はありません。 .NETで
、クラスA
タイプB
から継承及びタイプA
のオブジェクトがタイプB
のオブジェクトを期待するコードに渡された場合、渡されるオブジェクトは、B
に変換されないであろうが、A
のままであろう。これは、すべてのオブジェクトに型記述子への参照が格納されているために可能です。クラスには型記述子が格納されていません。 A
型の構造体が、B
型の構造体を期待するルーチンに渡すことができた場合、は、B
という構造体になります。それが賢明である場合は、A
からB
までの拡大変換演算子を定義する方が現実的です。
タイプA
の構造体をルーチンexpecting type B
に渡すと便利な場合があります。変換演算子はそこでは助けません。ただし、構造体型A
にはB
のフィールドだけが含まれているため、やや面倒ではありますが、これを処理できます。そのフィールドは、次に参照するタイプB
ルーチンに渡すことができます。難しいのは、任意のフィールドへのアクセスに内部構造体の名前を含める必要があるということです。
構造体だけでなくクラスについても、「拡張型」という概念が役立ちます。すべてのクラスは、継承可能であろうとなかろうと、インスタンスメンバのみを含む拡張型で拡張できます。拡張型の変数または値は、基本型の実行時オブジェクトとみなされ、拡張型とその基本型の間、または同じ基本型から派生した拡張型の間のすべての変換は「拡大」とみなされ、 no-opsとして処理されます。拡張タイプの唯一の効果は、そのタイプに対して定義されたスコープメンバーをもたらすことです。これらは、拡張タイプとして宣言された変数と変数にのみ適用され、拡張タイプのメンバーは基本クラスメンバーよりも優先されるという点を除いて、拡張メソッドとよく似た動作をします。そのようなものの多くの用途を想像することができます(クラスのいくつかのインスタンスで拡張メソッドを使用したいが、すべてのインスタンスで拡張メソッドを使用したくない場合など)。特徴。
- 1. 派生構造体と親構造体へのC++キャスト
- 2. 別の構造体から新しい構造体または既存の構造体にコピー
- 3. はなぜ構造体を作成した構造体宣言
- 4. C構造体内の構造体内部の構造体
- 5. 構造体のポインタからの構造体の値へのアクセス
- 6. Cプログラミング - ベース構造体型「派生」タイプ
- 7. 構造体の配列を別の構造体にネストする
- 8. 構造体またはポインタの構造体ですか?
- 9. 構造体を別の構造体に渡す方法
- 10. ある構造体を別の構造体にコピーする
- 11. 構造体を別の構造体メンバにキャストする方法
- 12. C++の構造体内の構造体
- 13. 構造体のベクトルがmmapになっている構造体
- 14. 構造体から派生したクラスの仮想関数
- 15. 構造体内の構造体
- 16. 構造体の配列 - 構造体?
- 17. Cの構造体定義内で構造体ポインタを使用するのはなぜですか?
- 18. エリクサー:構造体にアクセスできない
- 19. 異なる構造体内の構造体へのポインタ。 C
- 20. 構造体からCのフィールドをプリントできない
- 21. 私は、単純な構造体持っている構造体
- 22. 別の構造体にフレキシブルな配列メンバーを持つ構造体
- 23. C構造体、構造体へのポインタ、適切な初期化
- 24. スカラケースクラス - 構造体ですか?
- 25. 構造体でテンプレートを定義できないのはなぜですか?
- 26. なぜC++構造体でnamespaceディレクティブを使用できないのですか?
- 27. C++で構造体をマップできないのはなぜですか?
- 28. 構造体変数と構造体メンバ
- 29. sizeof構造体内構造体
- 30. 構造体がクラスより遅いのはなぜですか?
これは、構造体から継承したときに、すべてのメソッド、プロパティ、およびフィールドのコピーを持っていることになりますが、テンプレート構文を排除するものではありません。割り当て互換性はありませんが、「子孫」に追加した追加のものと同じレイアウトになります。私は事実は十分だと思うが、混乱するだろう。 –
2つの単語:オブジェクトのスライス。 http://en.wikipedia.org/wiki/Object_slicing –
@ LasseV.Karlsen:まさに。サポートされていれば、この質問は「なぜBase b = new Derived()を書くことができないのですか? – SLaks