gpt4 book ai didi

c++ - Petting Zoo C++/继承类/子类

转载 作者:太空宇宙 更新时间:2023-11-04 13:40:17 27 4
gpt4 key购买 nike

我得到了一个练习,它应该适用于不同的类以及它们在不同类之间的关系。

作用于不同类的函数应该为一个抽象的基本类定义,然后在对象上使用,该类是基本类的子类。

在本练习中,我应该展示分离为接口(interface)和实现的优势。

我应该想象一个包含许多不同动物的动物园。这些动物应该分为哺乳动物、鸟类或鱼类。

  • 游客应该可以喂一些动物(山羊、鹅、金鱼)
  • 而其他动物无法喂食(熊、鲨鱼)
  • 游客还应该可以抚摸一些动物,比如山羊,而其他动物,比如熊、鸟和鱼则不能抚摸
  • 一些动物应该有特有的声音——鱼是安静的
  • 宠物也应该有一个昵称(每个人)

我应该实现类/子类以便我能够使用

void feed ( Animal& Animal )
void pet ( mammal& mammal )
void noise ( mammal& mammal )
void noise ( bird& bird )

我应该有 10 种不同的动物——每种类型(哺乳动物、鸟类、鱼类)中至少有 2 种动物通过使用其中一种功能(无效饲料等)应该询问动物是否可以进行所需的操作,然后返回答案类似于:

“可以喂山羊比利”

“熊布鲁诺不喜欢当宠物”

“鹅赫塔夸克”

动物的特征适用于整个物种(哺乳动物、鸟类、鱼类只是特定动物)因此它们独立于实例(所有山羊都可以喂食——不仅仅是比利山羊)关键字“static”可用于分配类变量“static const bool feedable = ;”然后变量不会再次应用于每个实例,而且它变得确定该特征适用于该类型的所有动物。

使用抽象基类和虚方法。每种动物/类型都应使用其特定的变量和方法它需要工作(不应该有 bool petable for fish)

最后还要画一个树状结构的继承图

对不起,我的英语很糟糕,但我没有其他人可以问 - 所以我尽量解释清楚

这是我到目前为止得到的:

zoo.h

    #include <iostream>
#include <cstring>

using namespace std;

// CAnimal abstract class

class CAnimal {

public:
CAnimal() { strcpy(m_name, ""); }
virtual ~CTier() { }
void setName(char *name) { strcpy(m_name, name); }
virtual void introduce() { cout << "Hello, my name is " <<m_name <<end1; }
virtual CAnimal* create(char *) = 0; // pure virtual method

private:
char m_name[50];
};

// CMammal

class CSMammal : public CAnimal {
public:
CMammal() { }
virtual ~CMammal() { }
virtual void introduce() {
CAnimal::introduce();
cout <<"I am a mammal"<<end1;

}
};

// CFish

class CFish : public CAnimal {
public:
CFish() { }
virtual ~CFish() { }
virtual void introduce() {
CTier::introduce();
cout << "I am a Fish" <<end1;

}
};

// CBird

class CBird : public CAnimal {
public:
CBird(){ }
virtual ~CBird() { }
virtual void introduce() {
CTier::introduce();
cout << "I am a Bird" <<end1;

}
};

// Tierart - legt eine Klasse an, welche von Vogel, Fisch oder Säugetier abgeleitet ist. Der Konstruktor legt die individuellen Namen fest.

#define ANIMALTYPE(cname,parentclass,whoami)
class name : public parentclass
{
public:
cname(char *name) { CTier::setName(name); }
/* Default-Konstruktor für Kreirrepresäntant */
cname() { }
void introduce() {
parentclass::introduce();
cout << "Ich bin " << whoami <<end1;

}
/* Kreirfunktion: Forward Ownership! */
CTier* create(char *name) { return new cname(name); }

};

这是我的zoo.cpp

    #include <stdlib.h>
#include <time.h>
#include "zoo.h"


// giving names
char *namen[] = { "Mehmet", "Aykut", "Dumbo", "Helga", "Henni",
"KQLY", "Pasha", "Huan", "Emilio", "Blume" };
const int namZahl = sizeof(namen) / sizeof(*namen);

// Tierarten (Klassen anlegen)
SPEZIES(CGoat, CMammal, "a Goat")
SPEZIES(CPenguin, CBird, "a Penguin")
SPEZIES(CGoldfish, CFish, "a Goldfish")
SPEZIES(CBaer, CMammal, "a Baer")
SPEZIES(CGoose, CBird, "a Goose")
SPEZIES(CShark, CFish, "a Shark")
SPEZIES(CBadge, CMammal, "a Badger")
SPEZIES(CSalmon, CFisch, "a Salmon")
SPEZIES(CBlackbird, CBird, "a Blackbird")
SPEZIES(CElefant, CMammal, "an Elefant")

// main methode

int main(void) {

所以现在我不知道如何实现那些其他的“空白”,如果我可以喂养动物 + 在练习的其余部分使用静态命令,它们会给我信息。

最佳答案

在这种情况下更好的设计是将所有常见行为移动到抽象的基类,然后让子类以自己的方式实现特定行为。例如:-

MakeNoise();

被所有动物支持,因此您可以轻松地将其作为纯虚函数包含在基类中。但是,如果您认为 feeding of animals 以与 MakeNoise 相同的方式包含在基类中,那么您将不会获得直观的行为。例如:-

Feed(Item x);

鲨鱼不能被喂食。你会如何在设计中翻译它。使该函数在 Shark 中抛出错误?

这意味着可以喂养鲨鱼,但尝试喂养它们是错误的。

因此,最好将其从基类中移出并根据行为类来实现它。

class Feedable {};
class Feed1 : public Feedable {};

然后在您需要此行为的类中实现这些。

关于c++ - Petting Zoo C++/继承类/子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27966011/

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