宠物动物园C++/继承类/子类

Petting Zoo C++ / Inheritance Class/Subclasses

本文关键字:继承 子类 C++ 动物园      更新时间:2023-10-16

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

应该为抽象的基本类定义适用于不同类的函数,然后用于对象,该类是基本类的子类。

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

我应该想象一个动物园,里面有许多不同的动物。这些动物应分为哺乳动物,鸟类或鱼类。

  • 游客应该能够喂一些动物(山羊,鹅,金鱼)
  • 而其他人则无法喂食(熊,鲨鱼)
  • 游客还应该能够抚摸一些动物,如山羊,而其他动物如熊,鸟类和鱼不能成为宠物
  • 有些动物应该有特有的噪音——鱼是沉默的
  • 宠物也应该有一个昵称(他们每个人)

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

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

我应该有 10 种不同的动物 - 每种类型(哺乳动物、鸟类、鱼类)至少有 2 种,通过使用其中一个功能(空隙饲料等),应该询问动物是否可以进行所需的操作,然后给出答案如下:

"山羊比利可以喂饱"

"熊布鲁诺不喜欢当宠物"

"鹅赫塔夸克"

动物

的特征适用于它们的整个物种(哺乳动物,鸟类,鱼类只是特定的动物)因此,它们独立于实例(所有山羊都可以喂食 - 不仅仅是比利)关键字"static"可用于分配类变量"静态常量布尔可馈送 =;"然后该变量将不会再次应用于每个实例,而且它变得确定该特征适用于该类型的每种动物。

使用抽象的基本类和仅使用虚拟方法。 每种动物/类型都应该使用其特定的变量和方法它需要工作(不应该有适合鱼的布尔值)

最后,我们还应该绘制一个图表,显示树结构中的继承

对不起,我的英语很差,但我没有其他人要问 - 所以我试图尽可能地解释它

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

动物园

    #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); }
        };

这是我的动物园.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();

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

Feed(Item x);

鲨鱼是不能喂的。您将如何在设计中翻译它。让该函数在鲨鱼中抛出错误?

这意味着鲨鱼可以被喂食,但试图喂食它们是错误的。

因此,最好将其移出基类并在行为类方面实现它。

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

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