编写一个哺乳动物类Mammal,再由此派生出狗类Dog,二者都声明speak()成员函数,该函数在基类中被声明为虚函数。声明一个Dog类的对象,通过此对象调用speak函数,观察运行结果。再设计一个函数,形参使用Mammal的指针或者引用,实参传入Dog类型,观察函数内部speak()的调用情况。
时间: 2024-02-28 11:57:18 浏览: 22
好的,以下是对你的问题的回答:
```cpp
#include <iostream>
using namespace std;
class Mammal {
public:
virtual void speak() {
cout << "Mammal speaking" << endl;
}
};
class Dog : public Mammal {
public:
void speak() {
cout << "Dog barking" << endl;
}
};
void func(Mammal& mammal) {
mammal.speak();
}
int main() {
Dog dog;
dog.speak();
Mammal* pMammal = &dog;
pMammal->speak();
func(dog);
return 0;
}
```
在上面的代码中,我们定义了一个基类Mammal和一个派生类Dog,都声明了一个成员函数speak,其中在基类中声明为虚函数。然后我们创建了一个Dog对象dog,并通过它调用了speak函数;接着我们使用Mammal的指针pMammal指向dog对象,并通过它调用了speak函数;最后我们定义了一个函数func,形参使用Mammal的引用,并将dog对象传入该函数,观察在函数内部speak的调用情况。
输出结果:
```
Dog barking
Dog barking
Dog barking
```
从输出结果可以看出,由于在基类中声明了虚函数speak,并在派生类中重载了它,所以在使用Dog对象调用speak函数时,会优先调用派生类Dog中的speak函数。在使用Mammal的指针或者引用调用speak函数时,也会根据实际指向的对象类型来调用相应的speak函数,这就是多态的体现。