多态继承不覆盖基类方法

时间:2012-04-27 13:30:58

标签: c++ inheritance vector polymorphism

我的基类:

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

3 个答案:

答案 0 :(得分: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];

答案 1 :(得分:0)

在基类中:

virtual void input();

在派生类

virtual void input() override;

答案 2 :(得分:0)

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

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

你应该记住,使用虚拟功能需要付出代价,你应该在实际使用它之前考虑一下。