Pergunta

O código a seguir, imprime

Derived
Base
Base

Mas preciso de todos os objetos derivados colocados no usuário :: itens, chame sua própria função de impressão, mas não a classe base um. Posso conseguir isso sem usar ponteiros? Se não for possível, como devo escrever a função que exclui o usuário :: itens um por um e libera memória, para que não haja vazamentos de memória?

#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();
}
Foi útil?

Solução

Você precisa usar ponteiros e precisa dar à sua classe base um destruidor virtual. O destruidor não precisa fazer nada, mas deve existir. Sua função de adição se parece:

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

onde itens é um vector<Base *>. Destruir os itens (assumindo um destruidor virtual):

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

Outras dicas

Você precisa de um destruidor virtual para a base para garantir que objetos do tipo Derived Seja destruído corretamente ao ligar para excluir um ponteiro do tipo Base.

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

  virtual ~Base( ) { }  // virtual destructor
};

Então você pode usar impulsos ptr_vector Para armazenar dicas para seus objetos que são excluídos quando o contêiner é destruído.

Apenas explicando:

Para entender o que está acontecendo, você pode tentar definir o resumo da base de classe (por exemplo, definindo qualquer método puro virtual). Nesse caso, espero que você veja erros do compilador. Dessa forma, você reconhecerá o que o Vector realmente faz: cria novas instâncias de base de classe por meio de construção de cópias quando você pressionar (derivado). É por isso que você deseja usar ponteiros. Em seguida, o Vector trabalha com seus objetos criados originalmente do tipo derivado em vez de cópias próprias da base do tipo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top