C++ 在同一容器中存储子类对象而不丢失数据?

C++ 在同一容器中存储子类对象而不丢失数据?,c++,object,containers,parent-child,base,C++,Object,Containers,Parent Child,Base,假设我有一个基类叫做水果 class Fruit{ public TYPE{ Apples, Oranges, Grapes, NoType }; virtual int getType(){ return Fruit::TYPE::NoType; }; virtual ~Fruits(){}; virtual int randomFunc(){ return 991; }; } 然后假设我有一个叫做苹果的儿童班 class Apple : public Fruit{

假设我有一个基类叫做水果

class Fruit{

  public TYPE{ Apples, Oranges, Grapes, NoType };
  virtual int getType(){ return Fruit::TYPE::NoType; };
  virtual ~Fruits(){};

  virtual int randomFunc(){ return 991; };

}
然后假设我有一个叫做苹果的儿童班

class Apple : public Fruit{

  virtual int getType()override{ return Fruit::TYPE::Apples; };

  virtual int childFunc(){ return -1; };

}
现在,我的问题是,是否可以接收一个带有基类水果的对象,并在同一个映射/容器中存储各种子对象,而不丢失“childFunc()”功能,或基类中不存在的任何变量/函数?理想情况下,我想找到类似的东西

int FruitStorage::addFruit( Fruit* f, int i ){

     this->fruitsMap[i] = *f; //I feel like receiving a base object will strip the child functionality. 
     return this->fruitsMap[i]->childFunc(); //I need to use the child functions after the object is stored.

}

有没有可能为类似的东西使用模板?这是一种普遍不赞成的做法吗?我对单独容器的问题是,我需要在先进先出的基础上进行跟踪。

在容器中存储
std::shared\u ptr
。要查看是否可以依赖childFunct(),需要执行
动态\u cast(fruit.get())
其中fruit是
std::shared\u ptr

请参阅。当您通过值将
Fruit
传递给
addFruit
时,甚至在您将其放入容器之前,您就已经经历了这种情况。要保留多态性行为,您需要通过(可能是智能的)指针传递
Fruit
(或其派生类)的实例。糟糕的是,我忘了显示我正在接收一个Fruit对象的指针。您还忘了显示
fruitsMap
的声明。一行看起来像是存储对象,但下一行表明它存储指针。这是哪条路?我的直接对象我只是指基类。如果我收到基类,并将其转换为基类(在映射/容器中),它将失去子类的所有功能。你声称当你通过指针传递对象时,你已经知道了足够的知识来避免切片,所以也可以通过指针来存储它。如果我正在解析大量的水果(生成了大量的对象),dynamic_cast会减慢应用程序的速度吗?在声称要处理
水果的代码中,为什么要调用一个特定于
Apple
且不在
Fruit
中的方法?主要是因为我认为使用一个“addFruit”函数可以更容易地接受各种类型的水果,并且仍然允许每种类型执行和保持不同的功能。然后稍后,找出它是什么类型(通过使用基类中的虚拟getType()函数),并调用相应的不同函数。这会减轻您对性能的担忧吗?我很好奇,我不知道不同的功能意味着什么。有机会在那里有一个虚拟函数(每个子类有不同的实现)