📄 hour18_1.cpp
字号:
// Listing 18.7
// Deriving ADTs from other ADTs
#include <iostream>
enum COLOR { Red, Green, Blue, Yellow, White, Black, Brown } ;
class Animal // common base to both horse and bird
{
public:
Animal(int);
virtual ~Animal() { std::cout << "Animal destructor...\n"; }
virtual int GetAge() const { return itsAge; }
virtual void SetAge(int age) { itsAge = age; }
virtual void Sleep() const = 0;
virtual void Eat() const = 0;
virtual void Reproduce() const = 0;
virtual void Move() const = 0;
virtual void Speak() const = 0;
private:
int itsAge;
};
Animal::Animal(int age):
itsAge(age)
{
std::cout << "Animal constructor...\n";
}
class Mammal : public Animal
{
public:
Mammal(int age):Animal(age)
{ std::cout << "Mammal constructor...\n";}
virtual ~Mammal() { std::cout << "Mammal destructor...\n";}
virtual void Reproduce() const
{ std::cout << "Mammal reproduction depicted...\n"; }
};
class Fish : public Animal
{
public:
Fish(int age):Animal(age)
{ std::cout << "Fish constructor...\n";}
virtual ~Fish()
{ std::cout << "Fish destructor...\n"; }
virtual void Sleep() const
{ std::cout << "fish snoring...\n"; }
virtual void Eat() const
{ std::cout << "fish feeding...\n"; }
virtual void Reproduce() const
{ std::cout << "fish laying eggs...\n"; }
virtual void Move() const
{ std::cout << "fish swimming...\n"; }
virtual void Speak() const { }
};
class Horse : public Mammal
{
public:
Horse(int age, COLOR color ):
Mammal(age), itsColor(color)
{ std::cout << "Horse constructor...\n"; }
virtual ~Horse()
{ std::cout << "Horse destructor...\n"; }
virtual void Speak()const
{ std::cout << "Whinny!... \n"; }
virtual COLOR GetItsColor() const
{ return itsColor; }
virtual void Sleep() const
{ std::cout << "Horse snoring...\n"; }
virtual void Eat() const
{ std::cout << "Horse feeding...\n"; }
virtual void Move() const
{ std::cout << "Horse running...\n";}
protected:
COLOR itsColor;
};
class Dog : public Mammal
{
public:
Dog(int age, COLOR color ):
Mammal(age), itsColor(color)
{ std::cout << "Dog constructor...\n"; }
virtual ~Dog()
{ std::cout << "Dog destructor...\n"; }
virtual void Speak()const
{ std::cout << "Whoof!... \n"; }
virtual void Sleep() const
{ std::cout << "Dog snoring...\n"; }
virtual void Eat() const
{ std::cout << "Dog eating...\n"; }
virtual void Move() const
{ std::cout << "Dog running...\n"; }
virtual void Reproduce() const
{ std::cout << "Dogs reproducing...\n"; }
protected:
COLOR itsColor;
};
int main()
{
Animal *pAnimal=0;
int choice;
bool fQuit = false;
while (1)
{
std::cout << "(1)Dog (2)Horse (3)Fish (0)Quit: ";
std::cin >> choice;
switch (choice)
{
case 1:
pAnimal = new Dog(5,Brown);
break;
case 2:
pAnimal = new Horse(4,Black);
break;
case 3:
pAnimal = new Fish (5);
break;
default:
fQuit = true;
break;
}
if (fQuit)
break;
pAnimal->Speak();
pAnimal->Eat();
pAnimal->Reproduce();
pAnimal->Move();
pAnimal->Sleep();
delete pAnimal;
std::cout << "\n";
}
pAnimal = new Animal (5); // new animal
// The line above will produce a compiler error
// because Animal is an abstract class and cannot
// be directly instantiated! The compiler knows it
// is abstract because a method contains "const = 0"
// (Animal::Sleep for instance).
std::cout << "new animal: \n";
pAnimal->Speak();
pAnimal->Eat();
pAnimal->Reproduce();
pAnimal->Move();
pAnimal->Sleep();
delete pAnimal;
std::cout << "\n";
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -