如何使用父指针中的子函数?

时间:2015-11-05 23:19:54

标签: c++

以下是我正在使用的示例父母和孩子。

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输入和输出函数。家庭不存在。

2 个答案:

答案 0 :(得分:3)

如果Home::inputHome::output不需要实现,请将它们设为纯虚函数:

virtual void input() = 0;
virtual void output() = 0;

否则,您需要在Home中为它们定义一个实现,以便链接器不会抱怨它:

virtual void input() { /* code */ }
virtual void output() { /* code */ }

您还需要为基类input和派生类output制作HomeOcelot的签名相同的签名。将流参数添加到Home::inputHome::output的签名中,或将其从Ocelot::inputOcelot::output中删除。

此外:list<Home>会给您带来麻烦;您将需要使用list<Home*>,因此基类(由于纯虚函数而现在是抽象的)未被实例化。

答案 1 :(得分:0)

  

列出动物;

如果Home是抽象类,则无法执行此操作。 std容器不能保存抽象类(接口),只是因为这些不能构造或实例化。你能做的是:

list<Home*> animals;

除此之外,将input()output()方法设为纯虚拟(=0;),并在继承Home接口的子类中实现它们。