繁体   English   中英

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

[英]Why I can not use abstract class in std::vector?

我是从这些问题中得出的:

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

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

据我所知,数据是在动态的std ::向量,这意味着有内部的指针在分配std::vector

那是绝对正确的。 然而,指针(实际上,在非常常见的实现两个指针中的一个)指向型的相同大小元件的阵列T ,而不是一个单一的元件T或其亚型。 本质上,指针用于表示数组,而不是指代类或其子类。

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

数据是动态分配在std::vector ,这意味着有内部指针在std::vector

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

虽然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类是可复制的(并且是非抽象的)。 如果它是抽象的,编译器将为您省去麻烦并且无法声明向量。

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

资源

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM