【发布时间】:2015-05-25 10:46:43
【问题描述】:
假设我有以下代码,简而言之,有:
- 带有指向
PointerClass的指针的BaseClass - 一个继承自
BaseClass的ChildClass - 具有
std::vector的ChildClasss 和std::vector的BaseClass*s 的HolderClass:
整个代码如下:
#include <stdlib.h>
#include <time.h>
#include <vector>
class PointerClass {
public:
int num;
double num2;
PointerClass() {
srand(time(NULL));
num = rand() % 100;
num2 = rand() % 100 / 2.0;
}
};
class BaseClass {
public:
PointerClass *pointerClass;
};
class ChildClass: public BaseClass {
public:
ChildClass() {
pointerClass = new PointerClass();
}
};
class HolderClass {
public:
std::vector<BaseClass*> basePointerVec;
std::vector<ChildClass> childVec;
HolderClass() {
}
void addParentClass() {
ChildClass childClass = ChildClass();
childVec.push_back(childClass);
basePointerVec.push_back(&childClass);
}
};
int main(int argc, const char * argv[]) {
HolderClass holderClass = HolderClass();
for (int count = 0; count < 20; count++) {
holderClass.addParentClass();
}
for (int count = 0; count < holderClass.basePointerVec.size(); count++) {
delete holderClass.basePointerVec[count]->pointerClass;
}
return 0;
}
我的问题是,在将指向ChildClass 的指针添加到std::vector<BaseClass*> basePointerVec 和实际的ChildClass 到addParentClass() 方法中HolderClass 中的std::vector<ChildClass> childVec 之后,basePointerVec 中的数据和childVec 完全不同。
此外,当我尝试从childVec 中释放PointerClasses 时,一切正常。但是当我尝试从basePointerVec 中释放它们时,我收到一个错误消息,告诉我我正在尝试释放一个我没有为其分配内存的指针。
果然,当我使用断点检查所有内容时,我发现了一些奇怪的行为。似乎每次我在addParentClass() 中调用ChildClass childClass = ChildClass(); 时,basePointerVec 中的每个指针都会更改为指向新创建的ChildClass 的BaseClass。
我在实际程序中这样做的目的是利用多态性并让多个类继承自BaseClass。
所以我的问题是,为什么向量中的每个指针都被更改为指向新创建的类,我该如何解决?
附:抱歉这个问题太长了,我已经尽可能短了
【问题讨论】:
-
基类中的虚拟析构函数!!
-
你真的不想这样做。即使您理顺了对象的创建和寻址并使用了
basePointerVec.push_back(&childVec.back());,只要childVec扩展并为扩展的空间分配不同的内存床,您仍然会受到伤害。basePointerVec中的所有指针都将失效。
标签: c++ pointers vector polymorphism