C++ 多态性继承不重写基类方法

C++ 多态性继承不重写基类方法,c++,inheritance,vector,polymorphism,C++,Inheritance,Vector,Polymorphism,我的基类: class Item { protected: int count; string model_name; int item_number; public: Item();     void input(); } virtual void input(); 我的派生类: class Bed : public Item { private: string frame; string frameColour; string

我的基类:

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

public:
    Item();
    void input();
}
virtual 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;
}
void Item::input()
{ 

不能您尚未将您的方法标记为
virtual

此外,由于您有对象的
向量
,而不是指针,因此会遇到对象切片。虽然它会编译,但它是不正确的

正确的方法是使用指针向量或智能指针

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];
类项目
{
//....
virtual void input();//在基类中标记方法virtual
};
班级床位:公共物品
{
//....
虚空输入();
};
向量v;
项目*项目=新床;
v、 推回(项目);
//...
//记住释放内存
对于(int i=0;i
您尚未将您的方法标记为
虚拟方法

此外,由于您有对象的
向量
,而不是指针,因此会遇到对象切片。虽然它会编译,但它是不正确的

正确的方法是使用指针向量或智能指针

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];
类项目
{
//....
virtual void input();//在基类中标记方法virtual
};
班级床位:公共物品
{
//....
虚空输入();
};
向量v;
项目*项目=新床;
v、 推回(项目);
//...
//记住释放内存
对于(int i=0;i
在基类中:

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

public:
    Item();
    void input();
}
virtual void input();
在派生类中

virtual void input() override;
在基类中:

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

public:
    Item();
    void input();
}
virtual void input();
在派生类中

virtual void input() override;

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

有时,人们更喜欢将virtual关键字也放在派生类中,以提醒用户函数是虚拟的,但这不是必须的


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

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

有时,人们更喜欢将virtual关键字也放在派生类中,以提醒用户函数是虚拟的,但这不是必须的


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

@LuchianGrigore可能
virtual void input()重写C++11中的
。@LuchianGrigore可能
virtual void input()在C++11中重写
。此外,当您有一个指针容器时,您可能希望将该容器包装在具有相同接口的自定义类中,并让其插入和删除操作处理
new
s和
delete
s。@suszterpatt对我来说听起来像是一个智能指针(答案中已经有了)在技术上,它更像是一个智能容器,但更重要的是,它对于一个显然学习C++的人来说是一个很好的锻炼。)而且,当你有一个指针容器时,你可能想用相同的接口把这个容器包装在一个自定义类中,并且它的插入和删除操作要注意<代码>新< /Calp>
delete
s.@suszterpatt听起来像是指向我的智能指针(答案中已经有了)我想从技术上讲,它更像是一个智能容器,但更重要的是,对于那些显然学习C++的人来说,这是一个很好的锻炼。)虚拟函数的成本在决定是否使用它时不起作用。sn不相关,但如果您这样做:
Base&object=child;
对象没有切片(例如在函数调用中)虚拟函数的成本在使用与否的决定中不应起任何作用。此外,您是否介意解释如何获得引用向量?在这种情况下,使用引用并不相关,但如果这样做:
Base&object=child;
对象没有切片(例如在函数调用中)