【问题标题】:Why I can not use abstract class in std::vector?为什么我不能在 std::vector 中使用抽象类?
【发布时间】:2016-06-19 20:31:44
【问题描述】:

我来自这些问题:

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

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

【问题讨论】:

  • 您是否阅读了您链接的第三个问题的答案下的评论 - “原因是您正在调用复制构造函数,因此试图实例化一个抽象类。”
  • 不,我错过了......谢谢

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        为了在向量中插入一些东西,模板必须首先实例化类(因为它使用复制构造函数)。由于抽象类无法做到这一点,所以你不能这样做!

        Source

        【讨论】:

          猜你喜欢
          • 2011-06-18
          • 1970-01-01
          • 1970-01-01
          • 2023-04-05
          • 2018-03-22
          • 1970-01-01
          • 1970-01-01
          • 2011-02-21
          • 1970-01-01
          相关资源
          最近更新 更多