我需要一个可以存储从B
继承的类(A
)的向量。向量位于管理应用程序所有流的类中,并包含向量Test
。
A类
class A {
public:
virtual void test() {
cout << "Class A" << endl;
}
};
B类
class B : public A {
public:
virtual void test() {
cout << "Class B" << endl;
}
};
测试课
class Test {
private:
vector<A*> v;
public:
void input() {
A a;
B b;
A *a2 = &b;
for (int i = 0; i < 10; i++) {
if (i%2 > 0) {
v.push_back(&a);
} else {
v.push_back(a2);
}
}
}
void output() {
for (unsigned int i = 0; i < v.size(); i++) {
v[i]->test();
}
}
};
主
int main () {
Test t;
t.input();
t.output();
return 0;
}
该程序将 B A B A B A B A B A 类添加到向量中,并输出“A类”或“B类”,取决于什么类。
如果我将output()
的代码放在input()
方法中,程序运行正常。但正如它在这里,程序编译没有问题,但它在执行时给出了访问冲突错误。
这是一个更大问题的简化。我不想在output()
方法中使用input()
方法的所有代码。
从我看到的,从方法到方法,向量的指针已被破坏,并且没有正确指向。为什么呢?
答案 0 :(得分:4)
您正在对input
方法中在堆栈上创建的对象进行操作,这些对象在返回方法后会被销毁。
即使您将这些对象的地址存储在向量中并尝试使用output
方法访问它们,程序也会崩溃,因为这些对象不再存在。
而是在main
中创建对象,或在堆上动态创建它们。
答案 1 :(得分:0)
这些定义
A a;
B b;
定义函数输入的局部变量,在退出函数后将被销毁。指针变得无效。您应该动态分配将添加到向量中的对象。