c++ - 使用指针/引用影响本地成员的多态调用

标签 c++ polymorphism

我今天在编码时遇到了一个奇怪的情况,我希望有人能解释为什么会这样。

我有一个指向某个基类的指针列表:

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_listm_list 仍然包含指向原始 BaseClass 对象的指针。

关于c++ - 使用指针/引用影响本地成员的多态调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10569651/

相关文章:

java - 有没有办法向下转型 GWT AutoBean?

使用继承时的Java动态绑定(bind)

c++ - 多重继承冲突

c# - 无法在 C# 中创建两个具有相同名称的属性

java - 如何使用 Java 和 Jackson 库反序列化 Json 字符串以获得多态结果?

c++ - 使网络更改永久化 - C++

c++ - 在 OpenGL 中移动相机

c++ - 网格的蛇形表示

c++ - 从派生类到基类的static_cast会发生什么?

C++编译具有相同函数名的多个文件