包含派生类型的基类的C ++向量

时间:2011-03-12 14:38:59

标签: c++ oop inheritance

我有几个课程DemandBuildingFactoryFarm和其他一些课程。我希望将这些实例存储在一个单独的2d数组中,我通过创建一个基类Building来做到这一点,它除了允许我这样做之外什么都不做:(注意第二个向量是因为它是用于存储这些的2d向量地图上的建筑物)

vector<vector<Building*> > map;

而不是:

vector<vector<DemandBuilding*> > demand_buildings;
vector<vector<Factory*> > factories;
vector<vector<Farm*> > farms;
//etc...

(我离开了电脑,所以我不确定这是合法的C ++,虽然我认为是这样) 对我而言,这似乎是对继承的错误使用,是吗?

编辑:感谢您帮助我在概念上没有任何错误,但我已经意识到这样做不会对我的情况有所帮助,无论如何,谢谢。

2 个答案:

答案 0 :(得分:1)

从概念上讲,这没有任何问题 - 这一切都取决于你如何使用它。如果你发现自己不得不施放,你可能需要重新考虑设计。

此外,您很可能应该有一个虚拟析构函数,如果删除Building *并且析构函数不是虚拟的,则子类析构函数不会被执行

答案 1 :(得分:0)

不需要第二个向量,只需使用:

vector<Building*> buildings;

对于2D阵列,您可以:

vector< vector<Building*> > buildingMatrix;

或者如果您在编译时知道2d数组的大小:

Building* buildingMatrix[SOME_CONST_SIZE_1][SOME_CONST_SIZE_2];

所以你可以在这里找到所有建筑物的指针。

另外,您可以考虑将您的不同建筑物的所有常用方法放入基础建筑物中。根据需要使它们虚拟化,使用虚拟析构函数,以防您需要使用构建指针正确删除特定的构建。