今日、コーディング中に奇妙な状況に遭遇しました。誰かがなぜこれが起こっているのかを明らかにしてくれることを願っています。
私はいくつかの基本クラスへのポインタのリストを持っています:
std::list<BaseClass*> m_list;
次に、このリストからBaseClassポインターの1つを取得します
BaseClass* pBase = m_list.front();
次に、この基本クラスをその子クラスの1つに変換します。(ここで奇妙さが出てくると思います)
pBase = new ChildClass(*pBase);
ChildClassは、BaseClassesコピーコンストラクターを使用して、すべてのBaseClassesフィールドをコピーします。
このChildClassを使用して、BaseClassesメソッドの1つを呼び出して、BaseClassにフィールドを設定します。
pBase->SetSomeIntMember(10);
このint値をチェックすると、期待どおりに10になりますが、リストから同じChildClassを再度取得して、intメンバーをチェックすると変更されないため、ローカルでのみ変更されているように見えます。
うまくいけば、これは従うのにそれほどトリッキーではありませんでした。これは何が起こるのですか?ポリモーフィズムが関与していない状況では、クラスインスタンスへのポインタがあるため、明らかにローカルな変更だけではありません。新しいChildClassを作成するときにポインターを踏みつけていると思いますが、仮想メソッドが引き続き機能するため、リストのBaseClassがChildClassになることは間違いありません。