我参加了一个练习,它应该适用于不同的课程以及不同课程之间的关系。
应该为抽象基类定义适用于不同类的函数,然后在对象上使用,该类是基类的子类。
在本练习中,我应该展示分离到界面和实现的优势。
我应该想象一个包含许多不同动物的动物园。这些动物应分为哺乳动物,鸟类或鱼类。我应该实现类/子类,以便我能够使用
void feed ( Animal& Animal )
void pet ( mammal& mammal )
void noise ( mammal& mammal )
void noise ( bird& bird )
我应该有10种不同的动物 - 每种类型至少有2种(哺乳动物,鸟类,鱼类),通过使用其中一种功能(无效饲料等),应该询问动物是否可以进行所需操作然后回馈答案如下:
“山羊比利可以喂”
“熊布鲁诺不喜欢宠物”“鹅herta夸克”
动物的特征适用于它们的整个物种(哺乳动物,鸟类,鱼类只是特定的动物) 因此他们独立于实例(所有山羊都可以喂 - 不仅仅是比利) 关键字“static”可用于指定类变量 “static const bool feedable =;” 然后变量不会再次应用于每个单个实例,而且变得确定 该特征适用于每种类型的动物。
使用抽象基本类,只使用虚方法。每种动物/类型都应使用其特定的变量和方法 它需要工作(应该没有可用于鱼的bool)
最后我们还应绘制一个图表,显示树结构中的继承
抱歉,我的英语非常糟糕,但我没有其他人要问 - 所以我试着尽可能地解释它
这是我到目前为止所得到的:
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) {
所以现在我不知道如何实施那些其他的“空洞”,如果我可以用动静态命令为动物喂食动物+给我提供信息。
答案 0 :(得分:0)
在这种情况下,更好的设计是将所有常见行为移动到基类,这将是抽象的,然后让子类以自己的方式实现特定的行为。例如: -
MakeNoise();
每个动物都支持,因此您可以轻松地将其作为纯虚函数包含在基类中。但是,如果您认为喂养动物以与MakeNoise
相同的方式包含在基类中,那么您将无法获得直观的行为。例如: -
Feed(Item x);
不要喂鲨鱼。你会如何在设计中翻译它?让那些函数在Shark中抛出错误?
这意味着可以喂养鲨鱼,但试图喂它们是错误的。
所以,如果你只是将它从基类中移出并以行为类的方式实现它,那就更好了。
class Feedable {};
class Feed1 : public Feedable {};
然后在你想要这种行为的类中实现它们。