我今天在编码时遇到了一个奇怪的情况,我希望有人能解释为什么会这样。
我有一个指向某个基类的指针列表:
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,因为虚拟方法仍然有效。
最佳答案
pBase = new ChildClass(pBase);
这不会“使列表中的 BaseClass 成为 ChildClass”。它创建了 ChildClass 的新实例。只有在 ChildClass
的构造函数中对 pBase
进行的更改才能影响 pbase
之前指向的内容。 (你不能让一个类“成为子类的实例”。)
那行代码根本没有改变m_list
。 m_list
仍然包含指向原始 BaseClass
对象的指针。
关于c++ - 使用指针/引用影响本地成员的多态调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10569651/