为什么我不能在std :: vector中使用抽象类?

时间:2016-06-19 20:31:44

标签: c++ c++11 vector polymorphism abstract-class

我来自这些问题:

他们都建议我应该使用指针或智能指针。

据我所知,数据是在std::vector中动态分配的,这意味着std::vector内部有指针。那么为什么我不能直接使用抽象类呢?为什么我必须使用指针(我指定的那个)指针(内部)才能使用带有std::vector的抽象类。我知道像std::vector::resize这样的功能不起作用。但是,std::vector::reservestd::back_inserter将解决问题。

4 个答案:

答案 0 :(得分:6)

  

据我所知,数据是在std :: vector中动态分配的,这意味着std::vector

内部有指针

这绝对正确。但是,指针(实际上,非常常见的实现中的两个指针之一)指向类型为T的相同大小的元素的数组,而不是T或其子类型的单个元素。本质上,指针用于表示数组,而不是引用类或其子类。

这就是为什么你需要一个额外的间接级别 - 数组T[]的元素不能存储T的子类而不用对象切片

答案 1 :(得分:5)

  

数据在std::vector中动态分配,这意味着std::vector

内部有指针

不,这是一种误解。 std::vector在内部分配一个实例数组,您无法创建抽象类的实例。

答案 2 :(得分:2)

虽然std::vector的内存是动态分配的,但事实是在std::vector<T> T类型的对象中存储作为副本。而你根本无法复制抽象类。

例如,如果您有基类A,派生类Bstd::vector<A>。然后,如果您尝试在该向量中存储类型为B的对象,则会将其复制并存储为A。也就是说,它将拼接

class A {};
class B: public A {};

int main()
{
    std::vector<A> as;
    B b;
    as.push_back(b); //<-- splice!!!
}

那,假设类A是可复制的(并且是非抽象的)。如果它是抽象的,编译器将为您省去麻烦并且无法声明向量。

答案 3 :(得分:0)

为了在向量中插入内容,模板必须首先实例化该类(因为它使用复制构造函数)。由于这对抽象类是不可能的,所以你不能这样做!

Source