编写一个哺乳动物类Mammal,再由此派生出狗类Dog,二者都声明speak()成员函数,该函数在基类中被声明为虚函数。声明一个Dog类的对象,通过此对象调用speak函数,观察运行结果。再设计一个函数,形参使用Mammal的指针或者引用,实参传入Dog类型,观察函数内部speak()的调用情况
时间: 2024-03-23 11:40:04 浏览: 55
好的,下面是代码实现:
```c++
#include <iostream>
using namespace std;
class Mammal {
public:
virtual void speak() {
cout << "Mammal speak()" << endl;
}
};
class Dog : public Mammal {
public:
void speak() {
cout << "Dog speak()" << endl;
}
};
void test(Mammal& m) {
m.speak();
}
int main() {
Dog d;
d.speak();
Mammal* ptr = &d;
ptr->speak();
Mammal& ref = d;
ref.speak();
test(d);
return 0;
}
```
在这个示例中,我们定义了一个基类 `Mammal` 和一个派生类 `Dog`,`Mammal` 中声明了一个虚函数 `speak()`,在 `Dog` 中重写了这个函数。
在 `main()` 函数中,我们声明了一个 `Dog` 类的对象 `d`,并调用了它的 `speak()` 函数,输出了 `Dog speak()`。接着,我们用基类指针 `ptr` 和基类引用 `ref` 分别指向 `d`,并调用它们的 `speak()` 函数,输出的依然是 `Dog speak()`,这是由于虚函数的作用,使得在运行时能够动态绑定,调用派生类的函数。
最后,我们定义了一个函数 `test()`,它的形参是 `Mammal` 类型的引用,实参是 `Dog` 类型的对象 `d`。在函数内部调用了 `speak()` 函数,输出的是 `Dog speak()`。因为 `test()` 函数的形参是基类类型的引用,但是实参是派生类类型的对象,所以在函数内部调用的依然是派生类的函数,这也是多态性的体现。
阅读全文