下面的代码,打印出

Derived
Base
Base

但我需要投入用户::项目每一个派生类对象,调用它自己的打印功能,而不是基类之一。我能做到这一点,而无需使用指针?如果这是不可能的,我应该怎么写一个删除用户::项目一个一个地和释放内存的功能,所以不应该有任何内存泄漏?

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

class Base{
public:
  virtual void print(){ cout << "Base" << endl;}
};

class Derived: public Base{
public:
  void print(){ cout << "Derived" << endl;}
};

class User{
public:
  vector<Base> items;
  void add_item( Base& item ){
    item.print();
    items.push_back( item );
    items.back().print();
  }
};

void fill_items( User& u ){
  Derived d;
  u.add_item( d );
}

int main(){
  User u;
  fill_items( u );
  u.items[0].print();
}
有帮助吗?

解决方案

您需要使用指针,你需要给你的基类的虚析构函数。析构函数不必做任何事情,但它必须存在。然后,您的附加功能如下:

void add_item( Base * item ){
    item->print();
    items.push_back( item );
}

其中项是一个vector<Base *>。破坏项目(假设虚析构函数):

for( int i = 0; i < items.size(); i++ ) {
    delete items[i];
}
items.clear();
scroll top