#include <iostream>
class Animal {
protected:
std::string name;
public:
Animal(const std::string& n) : name(n) {}
virtual void eat() const {
std::cout << name << " is eating." << std::endl;
}
};
class Mammal : virtual public Animal {
public:
Mammal(const std::string& n) : Animal(n) {}
void breathe() const {
std::cout << name << " is breathing." << std::endl;
}
};
class WingedAnimal : virtual public Animal {
public:
WingedAnimal(const std::string& n) : Animal(n) {}
void flap() const {
std::cout << name << " is flapping wings." << std::endl;
}
};
class Bat : public Mammal, public WingedAnimal {
public:
Bat(const std::string& n) : Animal(n), Mammal(n), WingedAnimal(n) {}
void echo() const {
std::cout << name << " is using echolocation." << std::endl;
}
};
int main() {
Bat bat("Bruce");
bat.eat(); // From Animal
bat.breathe(); // From Mammal
bat.flap(); // From WingedAnimal
bat.echo(); // Bat's own method
return 0;
}