[英]Why I can not use abstract class in std::vector?
我是从这些问题中得出的:
他们都建议我应该使用指针或智能指针。
据我所知,数据是动态分配中std::vector
,这意味着内部有指针中std::vector
。 那么为什么我不能直接使用抽象类呢? 为什么我必须使用指针(我指定的那个)指针(内部)才能使用带有std::vector
抽象类。 我知道像std::vector::resize
这样的功能不起作用。 但是, std::vector::reserve
和std::back_inserter
将解决问题。
据我所知,数据是在动态的std ::向量,这意味着有内部的指针在分配
std::vector
那是绝对正确的。 然而,指针(实际上,在非常常见的实现两个指针中的一个)指向型的相同大小元件的阵列T
,而不是一个单一的元件T
或其亚型。 本质上,指针用于表示数组,而不是指代类或其子类。
这就是为什么你需要一个额外的间接级别 - 数组T[]
元素不能在没有对象切片的情况下存储T
子类。
数据是动态分配在
std::vector
,这意味着有内部指针在std::vector
不,这是一种误解。 std::vector
在内部分配实例数组,您无法创建抽象类的实例。
虽然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
类是可复制的(并且是非抽象的)。 如果它是抽象的,编译器将为您省去麻烦并且无法声明向量。
为了在向量中插入内容,模板必须首先实例化该类(因为它使用了复制构造函数 )。 由于这对抽象类是不可能的,你不能这样做!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.