其他分享
首页 > 其他分享> > C多态性和切片

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