#include <iostream>
#include <string>
class Animal {
protected:
std::string name;
public:
Animal(const std::string& n) : name(n) {}
void eat() const {
std::cout << name << " is eating." << std::endl;
}
void makeSound() const {
std::cout << name << " makes a sound." << std::endl;
}
};
class Dog : public Animal {
public:
Dog(const std::string& n) : Animal(n) {}
void wagTail() const {
std::cout << name << " is wagging its tail." << std::endl;
}
void makeSound() const {
std::cout << name << " barks: Woof!" << std::endl;
}
};
int main() {
Animal animal("Generic Animal");
Dog dog("Buddy");
animal.eat();
animal.makeSound();
dog.eat(); // Inherited from Animal
dog.makeSound(); // Overridden method
dog.wagTail(); // Dog-specific method
return 0;
}