#include <iostream> #include <string> using namespace std; class Animal{ public: //(1)定义纯虚函数实现多态,eat、run、sleep三个函数 12分 }; class Dog: public Animal{ public: virtual void eat() { cout << "狗吃骨头" << endl; } virtual void run() { cout << "狗奔跑" << endl; } virtual void sleep() {cout << "狗睡觉" << endl; } }; class Cat : public Animal{ public: virtual void eat() { cout << "猫吃鱼" << endl; } virtual void run() { cout << "猫走路" << endl; } virtual void sleep() {cout << "猫睡觉" << endl; } }; class Feeder{ public: void feed() { a.eat(); a.run();a.sleep()}//(2)补充形参 6分 }; int main(void) { Dog d; Cat c; Feeder f; f.feed(d) _________//(3)补全语句,完成动态多态 6分 return 0; }
时间: 2023-12-06 21:40:36 浏览: 80
补充内容如下:
(1) Animal 类中定义纯虚函数实现多态,eat、run、sleep 三个函数。
class Animal {
public:
virtual void eat() = 0;
virtual void run() = 0;
virtual void sleep() = 0;
};
(2) Feeder 类中的 feed 函数需要接收一个 Animal 类型的参数,因为它需要调用该参数的 eat、run、sleep 函数。
class Feeder{
public:
void feed(Animal &a) {
a.eat();
a.run();
a.sleep();
}
};
(3) main 函数中调用 feed 函数时需要传入一个 Animal 的子类,这里可以传入 Dog 或 Cat 的对象,实现动态多态。
int main(void) {
Dog d;
Cat c;
Feeder f;
f.feed(d); // 调用 feed 函数,传入 Dog 对象
f.feed(c); // 调用 feed 函数,传入 Cat 对象
return 0;
}
相关问题
定义一个基类Animal,它包含两个私有数据成员,一个是name,字符串类型,存储动物的名称(例如"Fido"或"Yogi"),另一个是整数成员weight,包含该动物的重量(单位是磅)。该基类还包含一个公共的虚成员函数who()和一个纯虚函数sound(),公共的虚成员函数who()返回一个string对象,该对象包含了Animal对象的名称和重量,纯虚函数sound()在派生类中应返回一个string对象,表示该动物发出的声音(模拟输出一串字符即可)。把Animal类作为一个公共基类,派生至少三个类Sheep、Dog和Cow,在每个类中实现sound()函数。该类还包含一个公共成员函数who(),它可以显示一个信息,给出Animal对象的动物名称和重量。成员在 两个派生类中是继承得来的。
好的,这是一个典型的面向对象编程的问题。下面是C++的实现代码:
```c++
#include <iostream>
#include <string>
using namespace std;
class Animal {
private:
string name;
int weight;
public:
Animal(string n, int w) : name(n), weight(w) {}
virtual string who() {
return "I am " + name + ", and I weigh " + to_string(weight) + " pounds.";
}
virtual string sound() = 0;
};
class Sheep : public Animal {
public:
Sheep(string n, int w) : Animal(n, w) {}
string sound() {
return "baa baa";
}
};
class Dog : public Animal {
public:
Dog(string n, int w) : Animal(n, w) {}
string sound() {
return "woof woof";
}
};
class Cow : public Animal {
public:
Cow(string n, int w) : Animal(n, w) {}
string sound() {
return "moo moo";
}
};
int main() {
Animal* a1 = new Sheep("Dolly", 150);
Animal* a2 = new Dog("Fido", 50);
Animal* a3 = new Cow("Betsy", 1000);
cout << a1->who() << " " << a1->sound() << endl;
cout << a2->who() << " " << a2->sound() << endl;
cout << a3->who() << " " << a3->sound() << endl;
delete a1;
delete a2;
delete a3;
return 0;
}
```
在Animal基类中,我们定义了两个私有数据成员name和weight,以及一个公共的虚成员函数who()和一个纯虚函数sound()。who()函数返回一个string对象,该对象包含了Animal对象的名称和重量,sound()函数在派生类中应返回一个string对象,表示该动物发出的声音。
然后我们派生了三个类Sheep、Dog和Cow,每个类中实现了sound()函数。
在main()函数中,我们创建了三个Animal对象,分别是Sheep、Dog和Cow。我们调用了它们的who()和sound()函数,输出了它们的信息和声音。最后我们释放了这三个Animal对象的内存。
这就是一个基于Animal基类派生出的多态的例子。
设计一个动物园程序,有两个类:动物类 Animal 和鸟类 Bird。其中,动物类包含公有属性 name 和 age,以及虚函数 show();鸟类继承自动物类,包含公有属性 wing_length,以及实现 show() 函数,打印出鸟的基本信息和翅膀长度。 要求: 1. 使用多态特性,定义一个指向动物类对象的指针,指向鸟类对象,并通过该指针调用 show() 函数。
答案:
没问题,以下是代码实现:
```c++
#include <iostream>
using namespace std;
class Animal {
public:
string name;
int age;
virtual void show() {
cout << "Name: " << name << endl;
cout << "Age: " << age << endl;
}
};
class Bird : public Animal {
public:
int wing_length;
void show() override {
Animal::show();
cout << "Wing length: " << wing_length << endl;
}
};
int main() {
Bird bird;
bird.name = "Eagle";
bird.age = 10;
bird.wing_length = 2;
Animal* ptr = &bird;
ptr->show();
return 0;
}
```
我们定义了 Animal 类和 Bird 类,其中 Bird 类继承自 Animal 类。使用多态特性,我们定义了一个指向动物类对象的指针 ptr,并让它指向 Bird 类对象。这样就能够调用 Bird 类的 show() 函数了,打印出鸟的基本信息和翅膀长度。
阅读全文