我正在用C ++编写一个控制台程序。假设我有一个抽象类Animal
,可实例化类Dog
和Cat
从中继承。
然后,我想创建一个vector<Animal*>
,以便可以浏览我创建的动物的整个列表并使用它们的虚函数GetName()
,该虚函数在子类中已重载。到这里为止一切正常。
现在,我在main()
中拥有名为createAnimal()
的此功能。我想以一种无论创建Dog
还是Cat
都可以返回指向父类的指针(或引用)的方式来实现它。所以我想像Animal* createAnimal()
那样做,但是出现一个错误告诉我 'Animal':无法实例化抽象类 。如何返回(以任何方式,指针,引用)子类作为其抽象父类?
谢谢!
答案 0 :(得分:1)
您要实现的目标称为an object factory,但是收到的错误消息表示您未正确实现该功能(类似于new Animal
,而您从不实例化摘要基类本身(仅其子类),或者您使用的结果不正确(例如Animal animal = createAnimal()
?)
那么,您的代码是这样的吗?
Animal *CreateAnimal(int type) {
if(type == 1) return new Cat;
}
std::vector<Animal *> animalVector;
animalVector.push_back(CreateAnimal(1));
然后它应该工作。
答案 1 :(得分:1)
Animal *cat = new Cat();
Animal *dog = new Dog();
“猫”和“狗”是动物类的孩子
class Cat : public Animal{
}
动物类应将getName作为纯虚函数
Class Animal {
...
virtual std::string getName() = 0;
...
}
然后,您可以将Cat和Dog类作为Animal类进行管理,并调用getName成员函数,不要忘记在Cat.cpp和Dog.cpp中覆盖此函数
我建议您阅读一些有关接口类的文档(仅具有纯虚函数的类)