gpt4 book ai didi

c++ - 在派生类 C++ 上访问方法的最佳方式

转载 作者:行者123 更新时间:2023-11-30 02:56:00 25 4
gpt4 key购买 nike

我有一些不同的对象,类型都是 Zoo , 有一个成员变量 Collection = vector<Animal> .我有一个动物园实例,其中所有元素都是动物,其中一个所有元素都是 Birds , 以及所有元素都是 Bats 的一个.两者 BirdsBats源自动物。

我希望有一个方法 fly()我可以召唤所有的鸟类和 bat ,但我不确定这样做的最佳方式。在我的鸟类/ bat 动物园中循环时,我应该只施法吗?像这样:

Bird thisBird = static_cast<Bird>(Collection[i]);
thisBird.fly();

...或者我能以某种方式在 Animal 上有一个虚函数,它只在从它派生的类上实现吗?

欢迎提出想法,以及为什么它们是“好代码”的理由!

最佳答案

哦,是的,Animal 可以有一个虚函数:

virtual void move(){}
virtual void fly(){}

当你命令一只狗飞时,它什么都不做。当您命令一只鸟移动时,它也可以调用 fly()

为会飞的动物正确定义 fly()Colection[i]->fly() 会做正确的事情。这样你的代码就会很简单。

但要做到这一点,您的集合必须收集指向动物的指针,而不仅仅是 Animal 对象。例如:

#include <vector>
#include <memory>
#include <iostream>
using namespace std;
struct Animal{virtual void fly(){}};
struct Bird:public Animal{void fly(){cout<<"fly\n";}};
int main()
{
vector<unique_ptr<Animal>> Colection(1);
Colection[0].reset( new Bird );
Colection.push_back(unique_ptr<Animal>(new Bird) );
Colection.push_back(unique_ptr<Animal>(new Animal) );
Colection[0]->fly();
Colection[1]->fly();
Colection[2]->fly();
}

阅读其他答案我可以推荐你实现类似的东西

struct Animal    {virtual bool fly(){return false;     }};
struct Bird:public Animal{bool fly(){cout<<"fly\n";return true;}};

而且您不需要单独的 canFly。

关于c++ - 在派生类 C++ 上访问方法的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15969972/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com