我想将一些子类描述的元素添加到一个向量中,遍历它们调用一个重写的方法,并希望它在可能的情况下调用重写的方法。但是我发现它似乎只是调用超类方法。从超类的向量中调用子类方法C++
我学习了Java并且不确定它为什么在C++中这样做。我尝试使用超类的指针向量重写代码,并将子类的指针投射到超类。通过指针访问这个工作。
理想情况下,我不想要将指针列表放入向量中,因为此后我必须手动删除每个(我相信?)以阻止内存泄漏,因为我将用new创建对象,以便它们保持过去该方法调用将它们添加到向量中。
有没有更好的方法来做到这一点,或者我坚持使用指针,并调用删除创建的对象时父类不需要?最好的载体是类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')才能获得多态行为。参见[“对象切片”](http://en.wikipedia.org/wiki/Object_slicing)。它在Java中工作,因为'MyClass obj'有效地声明了一个指向'MyClass'的指针。 –
'talk()'在'A'中不是虚拟的,所以没有方法可以覆盖。编译器将使用什么是静态类型,即“A”。 – 0x499602D2
@ 0x499602D2此代码的第一个版本中的错误,已修复,已添加虚拟,仍未按预期工作。 – Chewett