我正在尝试将多个子类元素添加到向量中,以遍历它们的方式调用重写的方法,并希望它在可能的情况下调用重写的方法。但是我发现它似乎只在调用超类方法。
我学习了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
}
}
要获得多态行为,您需要将说明virtual
符添加到要在派生类中重写的基类中的函数。
class A {
public:
virtual void talk() { printf("A\n"); }
};
您还应该养成override
在派生类中的重写函数上添加说明符的习惯,以便编译器可以帮助您解决此类问题。
class B: public A {
public:
virtual void talk() override { printf("B\n"); }
// ^ Compiler will report an error if base class' function
// is not virtual.
};
同样,您不能将派生的对象分配给基类的实例,否则会发生切片。
std::vector<A> vec;
/* ... */
B b;
/* ... */
vec.push_back(b); // Slicing. Information only in B is lost.
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句