C多态性和切片
作者:互联网
打印出以下代码
Derived
Base
Base
但我需要将每个Derived对象放入User :: items,调用自己的print函数,而不是基类.我可以在不使用指针的情况下实现吗?如果不可能,我应该如何编写逐个删除User :: items并释放内存的函数,以免出现任何内存泄漏?
#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 );
}
其中items是向量< Base *>.要销毁项目(假设是虚拟析构函数):
for( int i = 0; i < items.size(); i++ ) {
delete items[i];
}
items.clear();
标签:object-slicing,c,polymorphism 来源: https://codeday.me/bug/20190827/1741122.html