我来自这些问题:
他们都建议我应该使用指针或智能指针。
据我所知,数据是在std::vector
中动态分配的,这意味着std::vector
内部有指针。那么为什么我不能直接使用抽象类呢?为什么我必须使用指针(我指定的那个)指针(内部)才能使用带有std::vector
的抽象类。我知道像std::vector::resize
这样的功能不起作用。但是,std::vector::reserve
和std::back_inserter
将解决问题。
答案 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
,派生类B
和std::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)
为了在向量中插入内容,模板必须首先实例化该类(因为它使用复制构造函数)。由于这对抽象类是不可能的,所以你不能这样做!