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 void input();

在派生类中

virtual void input() override;
于 2012-04-27T13:33:56.837 回答
0

为避免对象切片,您可以使用指针或引用。对于您正在寻找的行为,您必须将函数声明为virtual在基类中。

有时人们更喜欢将 virtual 关键字也放在派生类中,以记住用户该函数是虚拟的,但这不是强制性的。

您还应该记住,使用虚函数是有代价的,在实际使用它之前应该考虑一下。

于 2012-04-27T13:43:51.687 回答