制作不同子类的实例的向量

and*_*son 5 c++ oop class abstract

尝试搜索,没有任何回报(我ithink).

是否可以制作抽象类的向量?

例如,我有超级单位.

我有子类士兵,车辆和轰炸机.

但是我想要在一个向量中的任何子类的实例,例如,向量UnitList可以包含士兵和车辆的实例吗?

这可能吗?如果它有帮助我正在使用C++.

Luc*_*ore 9

是的,但你需要使用指针或智能指针(我会选择这个).

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;
}
Run Code Online (Sandbox Code Playgroud)

不要忘记删除分配的内存.

为什么你不能使用实际的对象:

假设std::vector<X>.这是非法的,因为:

  1. 如果要使用一定数量的元素初始化向量,则分配将失败.向量在内部将对象存储在连续内存中.预分配将失败,因为它意味着需要创建对象,这对于抽象类是无法完成的.

  2. 即使你可以,或者基类不是抽象的,它也不会太多,因为你会受到对象切片的影响.


Moo*_*uck 7

由于每个对象的大小都不同,所以正确的方法是包含指向基类的指针的容器Unit(并确保它有一个virtual析构函数).

选项1 :( boost::ptr_vector需要升级库,无论如何都应该有)

ptr_vector<Unit> units;
units.push_back(new Soldier());
Run Code Online (Sandbox Code Playgroud)

选项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()));
Run Code Online (Sandbox Code Playgroud)