91 lines
1.9 KiB
C++
91 lines
1.9 KiB
C++
|
#include <iostream>
|
||
|
#include <string>
|
||
|
|
||
|
// 基类(父类)
|
||
|
class Animal {
|
||
|
public:
|
||
|
// 虚函数,用于实现多态
|
||
|
virtual void makeSound() {
|
||
|
std::cout << "Some generic animal sound" << std::endl;
|
||
|
}
|
||
|
|
||
|
// 公共方法
|
||
|
void eat() {
|
||
|
std::cout << "Eating..." << std::endl;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
// 派生类(子类)
|
||
|
class Dog : public Animal {
|
||
|
private:
|
||
|
std::string name;
|
||
|
int age;
|
||
|
|
||
|
public:
|
||
|
// 构造函数
|
||
|
Dog(std::string n, int a) : name(n), age(a) {}
|
||
|
|
||
|
// 重载虚函数,实现多态
|
||
|
void makeSound() override {
|
||
|
std::cout << "Woof!" << std::endl;
|
||
|
}
|
||
|
|
||
|
// 设置名字(封装)
|
||
|
void setName(std::string n) {
|
||
|
name = n;
|
||
|
}
|
||
|
|
||
|
// 获取名字(封装)
|
||
|
std::string getName() {
|
||
|
return name;
|
||
|
}
|
||
|
|
||
|
// 设置年龄(封装)
|
||
|
void setAge(int a) {
|
||
|
age = a;
|
||
|
}
|
||
|
|
||
|
// 获取年龄(封装)
|
||
|
int getAge() {
|
||
|
return age;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
// 另一个派生类(子类)
|
||
|
class Cat : public Animal {
|
||
|
public:
|
||
|
// 重载虚函数,实现多态
|
||
|
void makeSound() override {
|
||
|
std::cout << "Meow!" << std::endl;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
int main() {
|
||
|
// 创建Dog对象
|
||
|
Dog myDog("Buddy", 3);
|
||
|
myDog.eat(); // 输出: Eating...
|
||
|
myDog.makeSound(); // 输出: Woof!
|
||
|
|
||
|
// 使用封装方法设置和获取属性
|
||
|
myDog.setName("Max");
|
||
|
std::cout << "Dog's name: " << myDog.getName() << std::endl; // 输出: Dog's name: Max
|
||
|
myDog.setAge(4);
|
||
|
std::cout << "Dog's age: " << myDog.getAge() << std::endl; // 输出: Dog's age: 4
|
||
|
|
||
|
// 创建Cat对象
|
||
|
Cat myCat;
|
||
|
myCat.eat(); // 输出: Eating...
|
||
|
myCat.makeSound(); // 输出: Meow!
|
||
|
|
||
|
// 多态演示
|
||
|
Animal* animals[2];
|
||
|
animals[0] = &myDog;
|
||
|
animals[1] = &myCat;
|
||
|
|
||
|
for (int i = 0; i < 2; i++) {
|
||
|
animals[i]->makeSound(); // 输出: Woof! 和 Meow!
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|