質問

次のコードは、プリントアウト

Derived
Base
Base

しかし、私は、独自の印刷機能を呼び出すことではなく、基本クラス1、ユーザー::項目に入れておき派生オブジェクトが必要です。私は、ポインタを使用せずにそれを達成することはできますか?それが不可能な場合は、どのように私は、ユーザーを削除する関数を記述する必要があり::項目1つずつメモリを解放しますので、任意のメモリリークがあってはならないということ?

#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を定義しようとするかもしれない(例えば、純粋仮想いずれかの方法を定義します)。この場合、私はあなたがコンパイルエラーが表示されます期待しています。 あなたは(派生)一backときには、コピーコンストラクタによってクラスBaseの新しいインスタンスを作成します。この方法は、あなたは、ベクターが実際に何をするか認識します。 あなたの代わりにポインタを使用したい理由です。そして、ベクトル型ベースの独自のコピーの代わりに派生タイプのあなたの最初に作成されたオブジェクトで動作します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top