我今天在编码时遇到了一个奇怪的情况,我希望有人能解释为什么会这样。
我有一个指向某些基类的指针列表:
std::list<BaseClass*> m_list;
然后我从这个列表中得到一个 BaseClass 指针
BaseClass* pBase = m_list.front();
然后我把这个基类变成它的子类之一。(这就是我认为奇怪之处发挥作用的地方)
pBase = new ChildClass(*pBase);
ChildClass 使用 BaseClasses 复制构造函数来复制所有 BaseClasses 字段。
现在有了这个 ChildClass,我调用 BaseClasses 方法之一在 BaseClass 中设置一个字段。
pBase->SetSomeIntMember(10);
现在,如果我检查这个 int 值,它是 10,正如预期的那样,但它似乎只是在本地更改它,因为如果我再次从列表中获得相同的 ChildClass 并检查它的 int 成员,它将保持不变。
希望这不是太棘手。是什么导致这种情况发生?在任何不涉及多态性的情况下,它显然不仅是局部变化,因为我们有一个指向类实例的指针。我猜我在创建一个新的 ChildClass 时踩到了指针,但这肯定会使列表中的 BaseClass 成为 ChildClass,因为虚拟方法仍然有效。