【问题标题】:Returning a child class as their abstract parent class返回一个子类作为他们的抽象父类
【发布时间】:2019-04-25 11:45:46
【问题描述】:

我正在用 C++ 编写控制台程序。假设我有抽象类Animal,可实例化类DogCat 继承自该抽象类。

然后我想创建一个vector<Animal*>,这样我就可以浏览我创建的整个动物列表并使用它们的虚函数GetName(),它在子类中被重载。到这里一切正常。

现在,我在main() 中有这个函数,称为createAnimal()。我想以这样一种方式使它可以返回指向父类的指针(或引用),无论是否创建了 DogCat。所以我想让它像Animal* createAnimal(),但随后出现一个错误,告诉我'Animal':无法实例化抽象类。如何返回(以任何方式、指针、引用)子类作为其抽象父类?

提前致谢!

【问题讨论】:

  • 你能显示Animal* createAnimal()吗?
  • 我还没有实现。这个想法是,根据用户输入或传递给它的参数,将创建一个不同类型的对象(狗或猫),然后作为父类传递。
  • 问题是我什至不知道它应该具有哪种返回类型,但我想发送任何作为父类创建的对象,因为它们的真实类型对于使用我要给他们的。
  • 听起来在某个地方你有一些看起来像 Animal a; 的东西你可以有指向 Animal (Animal *a;) 的指针和对 Animal (Animal *a = myDog;) 的引用,但不是一个立场单独Animal,只要它包含纯虚函数(virtual const char * GetName() = 0;)。快速示例:ideone.com/NiqtkP

标签: c++ pointers reference return abstract


【解决方案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));

那么它应该可以工作了。

【讨论】:

  • 确实这就是我想要实现的目标!感谢您向我介绍这个概念。我想做的是Animal* CreateAnimal(int type){ },里面是return new Cat();,函数调用就像animalVector.push_back(CreateAnimal(1));,其中vector&lt;Animal*&gt; animalVector;。那是正确的方法吗?
  • 您引用的行——是的,请参阅我编辑的答案。
【解决方案2】:
Animal *cat = new Cat();
Animal *dog = new Dog();

Cat 和 Dog 类是 Animal 类的子类

class Cat : public Animal{
}

Animal 类应该将 getName 作为纯虚函数

 Class Animal {
 ...
 virtual std::string   getName() = 0;
 ...
 }

那么你可以将你的猫狗类作为一个动物类来管理,并调用getName成员函数,不要忘记在Cat.cpp和Dog.cpp中重写这个函数

我建议你阅读一些关于接口类(只有纯虚函数的类)的文档

【讨论】:

  • 嘿@VK_,感谢您的回答,但我的问题实际上是如何将对象作为其父类返回。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-13
  • 1970-01-01
  • 2021-07-22
  • 1970-01-01
  • 2014-06-12
  • 2020-07-03
相关资源
最近更新 更多