1

C# には、カスタム クラス エンティティの配列がありました。私が作成したさまざまな種類のエンティティと、C# ポリモーフィズムの動作方法により、さまざまな種類のエンティティを 1 つのエンティティ配列に保​​持することにしました (つまり、Entity 配列に Player エンティティ、Enemy エンティティなどを配置しました)。ただし、C++ では、エンティティのベクトルを使用して、プレーヤーなどの一意のエンティティを宣言すると、プレーヤーとして持っているすべての値を失い、エンティティとして持っている値のみを維持しているようです。これは私の見落としですか、それとも C++ ではポリモーフィズムの規則が異なるのでしょうか? どうすればこれを修正できますか?

4

2 に答える 2

2

C++ でのオブジェクトのスライス

スライシング問題とも呼ばれ、スーパークラス インスタンスにサブクラス インスタンスから値が割り当てられた場合に発生します。サブクラスで定義されたメンバー変数をコピーすることはできません。これは、スーパークラスにそれらを格納する場所がないためです。これは、オブジェクトを値で渡す場合にのみ発生します。コーネルが指摘したように、これを回避する方法は、オブジェクトへのポインターのベクトルを使用することです。

素敵なコード例については、ウィキペディアのエントリを参照してください。さらに良いことに、このSO スレッドは、偶発的なスライスによって引き起こされる可能性のある微妙なバグについて詳しく説明しています

于 2013-05-29T23:01:53.317 に答える