1

私の基本クラス:

class Item
{
protected:  
    int count;
    string model_name;
    int item_number;

public:
    Item();
    void input();
}

私の派生クラス:

class Bed : public Item
{
private:
    string frame;
    string frameColour;
    string mattress;

public:
    Bed();
    void input();
}

今のところ、私の入力関数が行おうとしているのは、使用されているメソッドを出力することだけです。

void Item::input()
{ 
    cout<<"Item input"<<endl;
}

void Bed::input()
{
    cout<<" Bed Input"<<endl;
}

mainで関数を呼び出すときに、派生クラスの入力を使用したいのですが、現在、アイテムの入力は使用されています。

主要:

vector<Item> v;
Item* item;
item= new Bed;
v.push_back(*item);
v[count].input();
count++;

私は自分が持っている本に記載されている方法に従いましたが、ベクトルに格納された新しいオブジェクトを作成する方法について混乱している可能性があると思います。

どんな助けでも素晴らしいでしょう、ありがとうHx

4

3 に答える 3

5

メソッドをとしてマークしていませんvirtual

また、vectorポインタではなくオブジェクトが存在するため、オブジェクトのスライスに遭遇します。コンパイルされますが、正しくありません。

適切な方法は、ポインターまたはスマートポインターのベクトルを使用することです。

class Item
{
   //....
   virtual void input(); //mark method virtual in base class
};

class Bed : public Item
{
   //....
   virtual void input();
};


vector<Item*> v;
Item* item = new Bed;
v.push_back(item);
//...
//remember to free the memory
for ( int i = 0 ; i < v.size() ; i++ ) 
    delete v[i];
于 2012-04-27T13:31:30.947 に答える
0

オブジェクトのスライスを回避するには、ポインタまたは参照を使用できます。探している動作についてはvirtual、基本クラスのように関数を宣言する必要があります。

関数が仮想であることをユーザーに覚えておくために、派生クラスにも仮想キーワードを配置することを好む人もいますが、これは必須ではありません。

仮想関数の使用にはコストがかかることも覚えておく必要があります。実際に使用する前に、仮想関数について検討する必要があります。

于 2012-04-27T13:43:51.687 に答える
0

基本クラス:

virtual void input();

派生クラスで

virtual void input() override;
于 2012-04-27T13:33:56.837 に答える