是的,但你需要使用指针或智能指针(我会选择这个).
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>
.这是非法的,因为:
如果要使用一定数量的元素初始化向量,则分配将失败.向量在内部将对象存储在连续内存中.预分配将失败,因为它意味着需要创建对象,这对于抽象类是无法完成的.
即使你可以,或者基类不是抽象的,它也不会太多,因为你会受到对象切片的影响.
由于每个对象的大小都不同,所以正确的方法是包含指向基类的指针的容器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)
归档时间: |
|
查看次数: |
8516 次 |
最近记录: |