试图寻找,没有返回(我我思)。
是否有可能使一个抽象类的载体?
例如,我有超类股。
和我有子类士兵,车辆和轰炸机。
不过,我想在一个向量任何子类的实例过,如UnitList矢量可以容纳两个士兵和车辆的情况?
这可能吗? 我使用的是C ++,如果有帮助。
试图寻找,没有返回(我我思)。
是否有可能使一个抽象类的载体?
例如,我有超类股。
和我有子类士兵,车辆和轰炸机。
不过,我想在一个向量任何子类的实例过,如UnitList矢量可以容纳两个士兵和车辆的情况?
这可能吗? 我使用的是C ++,如果有帮助。
是的,但你需要为使用指针或智能指针(我会去与此)。
struct X
{
virtual ~X() {} //<--- as pointed out in the comments
// a virtual destructor is required
// for correct deletion
virtual void foo() = 0;
};
struct Y : X
{
virtual void foo() { }
};
int main()
{
std::vector<X*> a;
a.push_back(new Y);
a[0]->foo();
for ( int i = 0 ; i < a.size() ; i++ )
delete a[i];
return 0;
}
不要忘了删除分配的内存。
假设std::vector<X>
这是因为非法的:
如果你想初始化一些数量的元素的矢量,分配将失败。 一种载体,存储在连续存储器内部的物体。 预分配将失败,因为这将意味着它需要创建对象,不能为抽象类来完成。
即使你能,或基类是不是抽象的,它不会帮助太多,因为你会从对象切片受到影响。
由于每个这些对象是不同的尺寸,做到这一点的适当的方式是包含指向基类的一个容器Unit
,(并确保它有一个virtual
析构函数。
选项1: boost::ptr_vector
(需要Boost库,你应该有反正)
ptr_vector<Unit> units;
units.push_back(new Soldier());
选项2: std::vector<std::unique_ptr<Unit>>
(需要C ++ 11编译器)
std::vector<std::unique_ptr<Unit>> units;
units.emplace_back(std::unique_ptr<Unit>(new Soldier()));
你不能随便创建一个抽象类的物体的向量,因为向量模板需要能够告诉编译器在编译时,其元素的大小。 但是,你可以让你通过保持指针的向量对象,而不是对象作为这样的一个载体想要什么。
更新:抽象阶级作为阶级已经知道大小。 它实际上是他们最派生类型,其大小是在编译时未知的情况下。 (感谢@LuchianGrigore和@MooingDuck指出这一点。)
我不认为这是可能做到这一点:
std::vector<Unit> unit_list;
unit_list.push_back(Soldier(params));
因为士兵,车辆和单位采取了不同的内存量。
然而,有可能使用指针,因为所有的指针占用固定的内存量:
std::vector<Unit*> unit_list;
unit_list.push_back(new Soldier(params));
我没有测试它,但它在我的头上是有道理的反正。