【发布时间】:2014-09-10 17:13:56
【问题描述】:
我正在尝试将许多子类元素添加到向量中,遍历它们调用被覆盖的方法,并希望它尽可能调用被覆盖的方法。但是我发现它似乎只是在调用超类方法。
我学习了 Java,但不确定它为什么要在 C++ 中这样做。我尝试使用超类的指针向量重写代码并将子类的指针转换为超类。然后通过指针访问它。
理想情况下,我不想将指针列表放入向量中,因为那时我必须手动删除每个指针(我相信?)以阻止内存泄漏,因为我将使用 new 创建对象,因此它们会持续存在方法调用将它们添加到向量中。
有没有更好的方法来做到这一点,或者当不需要父类时,我是否坚持使用指针并在创建的对象上调用 delete?向量最好是类 X 的列表,而不是类 X 的指针列表
我的结构是:
class a { vector vec of class X,
method to create and add an instance of X into vector vec,
method to create and add an instance of Y into vector vec }
class X { talk() }
class Y : public X { talk() }
演示我理想中想要做的事情的代码,但仅通过调用超类方法来显示其损坏:
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <vector>
class A {
public:
virtual void talk() { printf("A\n"); }
};
class B: public A {
public:
void talk() { printf("B\n"); }
};
int main(void) {
std::vector<A> vec;
std::vector<A*> vec2;
A a;
B b;
a.talk();
b.talk();
vec.push_back(a);
vec.push_back(b);
vec2.push_back(&a);
vec2.push_back(&b);
for(int i = 0; i < vec.size(); i++) {
vec[i].talk();
vec2[i]->talk(); //bad but short for example
}
}
【问题讨论】:
-
您确实需要指针(可能是智能指针,如
std::unique_ptr)才能获得多态行为。见"object slicing"。它在 Java 中工作,因为在那里,MyClass obj有效地声明了一个指向MyClass的指针。 -
talk()在A中不是虚拟的,因此没有方法可以覆盖。编译器将使用静态类型,即A。 -
@0x499602D2 此代码的第一个版本中的错误,已修复,添加了虚拟,但仍无法按预期工作。
-
@IgorTandetnik 嗯,有道理,想添加它作为答案吗?还有更多我可以阅读的文学作品吗?
标签: c++ pointers inheritance vector superclass