#include <iostream>
using namespace std;
class Animal {
protected:
std::string name;
int age;
public:
Animal(std::string n, int a);
virtual void makeSound();
//добавлена виртуальная функция для eat
virtual void eat();
virtual void sleep();
};
class Mammal : protected Animal {
protected:
bool isSleeping;
public:
Mammal(std::string n, int a);
//добавлена виртуальная функция makeSound, eat и sleep functions
virtual void makeSound();
virtual void eat();
virtual void sleep();
};
//класс собаки был выше
class Tail {
public:
//конструктор tail изменен на конструктор по умолчанию
Tail();
};
class Dog : public Mammal {
private:
bool isTailWagging;
//добавлена переменная Tail
Tail tail;
public:
Dog(std::string n, int a);
void makeSound();
void eat();
void sleep();
void fetch();
void wagTail();
};
class Cat : public Mammal {
private:
int numberOfLives;
public:
Cat(std::string n, int a);
void makeSound();
void eat();
void sleep();
};
Animal::Animal(std::string n, int a) {
name = n;
age = a;
}
void Animal::makeSound() {
std::cout << "This is a generic animal sound." << std::endl;
}
void Animal::eat() { std::cout << "The animal is eating." << std::endl; }
void Animal::sleep() { std::cout << "The animal is sleeping." << std::endl; }
//добавлен параметр возраста
Mammal::Mammal(std::string n, int a): Animal(n, a) { isSleeping = false; }
//добавлена проверка спит ли млекопитающее
void Mammal::makeSound() {
if (isSleeping) {
std::cout << "Zzz" << std::endl;
}
else {
std::cout << "This is a generic mammal sound." << std::endl;
}
}
//добавлена проверка спит ли млекопитающее
void Mammal::eat() {
if (isSleeping) {
std::cout << "Zzz" << std::endl;
}
else {
std::cout << "The mammal is eating." << std::endl;
}
}
void Mammal::sleep() {
std::cout << "The mammal is sleeping." << std::endl;
isSleeping = true;
}
Dog::Dog(std::string n, int a): Mammal(n, a) { isTailWagging = false; }
//добавлена проверка спит ли собака
void Dog::makeSound() {
if (isSleeping) {
std::cout << "Zzz" << std::endl;
}
else {
std::cout << "Woof!" << std::endl;
}
}
//добавлена проверка спит ли млекопитающее
void Dog::eat() {
if (isSleeping) {
std::cout << "Zzz" << std::endl;
}
else {
std::cout << "The dog is eating." << std::endl;
}
}
void Dog::sleep() {
std::cout << "The dog is sleeping." << std::endl;
isSleeping = true;
}
void Dog::fetch() { std::cout << "The dog is fetching." << std::endl; }
void Dog::wagTail() {
if (isSleeping == true) {
std::cout << "The dog can't wag its tail because it's sleeping."
<< std::endl;
}
else {
std::cout << "The dog is wagging its tail." << std::endl;
isTailWagging = true;
}
}
Cat::Cat(std::string n, int a): Mammal(n, a) { numberOfLives = 9; }
//добавлена проверка спит ли кот
void Cat::makeSound() {
if (isSleeping) {
std::cout << "Zzz" << std::endl;
}
else {
std::cout << "Meow!" << std::endl;
}
}
//добавлена проверка спит ли кот
void Cat::eat() {
if (isSleeping) {
std::cout << "Zzz" << std::endl;
}
else {
std::cout << "The cat is eating." << std::endl;
}
}
void Cat::sleep() {
std::cout << "The cat is sleeping." << std::endl;
isSleeping = true;
}
Tail::Tail() {}
//int Cat::eat = eat();
int main() {
Dog d("Fido", 3);
Cat c("Fluffy", 5);
Dog d1("Barky", 3);
Mammal* arr[] = { &d, &c, &d1 };
// should woof, meow, woof
for (int i = 0; i < 3; i++) {
arr[i]->makeSound();
}
// should eat in dog, cat, dog order
for (int i = 0; i < 3; i++) {
arr[i]->eat();
}
// should woof, meow, woof
for (int i = 0; i < 3; i++) {
arr[i]->makeSound();
}
// should sleep in dog, cat, dog order
for (int i = 0; i < 3; i++) {
arr[i]->sleep();
}
// shoudn't do anything as they're sleeping
for (int i = 0; i < 3; i++) {
arr[i]->makeSound();
}
// shoudn't eat actually, as they are sleeping
for (int i = 0; i < 3; i++) {
arr[i]->eat();
}
//!!!!!!!!! нельзя использовать все классы кроме собаки !!!!!!!!!!!
/*//shouldn't wag tails, they are sleeping, but some of them do not wag tail at all
for (int i = 0; i < 3; i++) {
arr[i]->wagTail();
}*/
// do they really need to sleep forever? :'(
// Hah, that's stange :)
/*Tail t("Taily", 2);
t.makeSound();*/
}