题
下面的代码,打印出
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();
其他提示
您需要为基础的虚拟析构函数调用类型Derived
的指针删除时做出型Base
的确认对象得到适当的销毁。
class Base{
public:
virtual void print(){ cout << "Base" << endl;}
virtual ~Base( ) { } // virtual destructor
};
然后,可以使用提升 ptr_vector 一>的指针存储到你的对象当容器被摧毁被删除。
只是说明:
为了理解正在发生的事情,可以尝试定义Base类抽象(例如定义的任何方法纯虚拟的)。在这种情况下,我想你会看到编译器错误。 这样,你就会认识到什么矢量实际上做的:它通过拷贝构造的方式创造一流基地的新情况下,你的push_back(衍生)时。 这就是为什么要使用指针来代替。然后载体能与您最初创建派生的类型,而不是基地的自身拷贝类型的对象。
不隶属于 StackOverflow