以下是我正在使用的示例父母和孩子。
class Home{
public:
virtual void input();
virtual void output();
private:
};
class Ocelot : public Home{
public:
void input(istream& ins = cin);
void output(ostream& outs = cout);
private:
int revolvers;
double shadeCover;
int waterSources;
};
这是我的主要地方,我正在尝试制作一个可以容纳不同类型的孩子并调用其功能的指针。
int main(){
list<Home> animals;
Home * ptr;
ptr = new Ocelot;
ptr->input();
ptr->output();
return 0;
}
当我尝试编译时,我只是对Home :: input和Home :: output进行了未定义的引用。究竟我在这里做错了什么?谢谢你的时间。
编辑:如果不清楚,我试图调用Ocelot输入和输出函数。家庭不存在。
答案 0 :(得分:3)
如果Home::input
和Home::output
不需要实现,请将它们设为纯虚函数:
virtual void input() = 0;
virtual void output() = 0;
否则,您需要在Home
中为它们定义一个实现,以便链接器不会抱怨它:
virtual void input() { /* code */ }
virtual void output() { /* code */ }
您还需要为基类input
和派生类output
制作Home
和Ocelot
的签名相同的签名。将流参数添加到Home::input
和Home::output
的签名中,或将其从Ocelot::input
和Ocelot::output
中删除。
此外:list<Home>
会给您带来麻烦;您将需要使用list<Home*>
,因此基类(由于纯虚函数而现在是抽象的)未被实例化。
答案 1 :(得分:0)
列出动物;
如果Home
是抽象类,则无法执行此操作。 std容器不能保存抽象类(接口),只是因为这些不能构造或实例化。你能做的是:
list<Home*> animals;
除此之外,将input()
和output()
方法设为纯虚拟(=0;
),并在继承Home
接口的子类中实现它们。