C++ std 容器 - 没有指针的多态性。是否可以?

Fra*_*con -1 c++ pointers c++11

是否可以在不使用指针的情况下在任何std c++ 容器中维护派生类的知识,动态地从容器转换返回值?我知道我可以创建一个向量或一些基类类型的指针,并让它们保留它们的子类。但问题是我必须使用指针吗?

例子:

struct A {
  int x = 0, y = 0, z = 0;
  virtual void foo() { cout << "A" << endl; };
};

struct B : public A {
  int a = 1, b = 1, c = 1;
  virtual void foo() { cout << "B" << endl; };
};

int main() {  
  <SOMECONTAINER><A> a(2);
  a[0] = A();
  a[1] = B();
  B * p;
  B& n = dynamic_cast<B&>(a[1]); // Always throws?
  p = dynamic_cast<B*>(&a[1]); // Always zero?
  cout << p << endl;
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*Jon 5

是的,您确实必须使用指针。否则,尝试将 aB放入一个容器中会A导致切片:将B被切割成 an A(这不仅限于容器,如果您这样做A a = B()或将 a 传递B给期望 an 的函数,则会发生完全相同的事情A)。

当你后来把它拿出来时,它A完全不知道它的血统包括一个杰出的祖先类型B——不管你怎么看A,你都不能让它成为B.

  • 正如 OP 所希望的那样,在不使用指针的情况下存储任何适用(子)类的对象。 (2认同)
  • 好吧,我们可以轻松地为从同一基础对象派生的对象编写容器,这些对象具有指定的最大大小和对齐要求,而无需写下所有可以保存的类型。这将(主要是)击倒反对意见。 (2认同)
  • @jon 但有人可能想知道是否有可能找到这个问题,那么为什么不回答呢?;) (2认同)