宠物动物园C++/继承类/子类
Petting Zoo C++ / Inheritance Class/Subclasses
我得到了一个练习,它应该适用于不同的类及其在不同类之间的关系。
应该为抽象的基本类定义适用于不同类的函数,然后用于对象,该类是基本类的子类。
在本练习中,我应该展示分离为接口和实现的优势。
我应该想象一个动物园,里面有许多不同的动物。这些动物应分为哺乳动物,鸟类或鱼类。
- 游客应该能够喂一些动物(山羊,鹅,金鱼)
- 而其他人则无法喂食(熊,鲨鱼)
- 游客还应该能够抚摸一些动物,如山羊,而其他动物如熊,鸟类和鱼不能成为宠物
- 有些动物应该有特有的噪音——鱼是沉默的
- 宠物也应该有一个昵称(他们每个人)
应该实现类/子类,以便我能够使用
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 {};
然后在需要此行为的类中实现这些。
- 继承期间显示未知行为的子类
- C++ 继承:将子类传递给需要基类的函数并获取子类行为
- 为什么我的子类不继承父类的字符串?
- 初始化依赖于子类的继承类的常量类成员
- 当子类需要在 c++ 中相互包含时,继承有缺陷
- 无法将数据从父类继承到C++中的子类
- C++子类继承
- C++继承,如何在基类的方法中调用子类的方法?
- 如果不手动完成,子类是否继承父类的析构函数?
- 模板化类继承的子类定义中的错误
- 模板类如何在 GCC 和 Clang 中继承子类
- C 模板继承.子类应用固定类型替换基类中的类型
- 具有菱形继承结构的子类的大小似乎很奇怪
- C++继承子类可修改变量
- 未调用/继承子类中的移动赋值运算符
- 如何从继承子类访问基类中的私有成员(c++)
- 如果某些实例不使用基类的属性,我应该继承子类吗?
- 从其他子类继承子类
- c++继承:子类实例同时使用子和父构造函数
- 继承子类时的默认保护级别是什么