编写一个哺乳动物类Mammal,再由此派生出狗类Dog,二者都声明speak()成员函数,该函数在基类中被声明为虚函数。声明一个Dog类的对象,通过此对象调用speak函数,观察运行结果。再设计一个函数,形参使用Mammal的指针或者引用,实参传入Dog类型,观察函数内部speak()的调用情况。
时间: 2024-03-23 17:40:14 浏览: 19
好的,这是一个简单的面向对象的编程问题。
我们可以先定义一个Mammal类,其中声明了虚函数speak(),如下所示:
```cpp
class Mammal {
public:
virtual void speak() {
cout << "Mammal speaking..." << endl;
}
};
```
然后我们再定义一个Dog类,它继承自Mammal类,如下所示:
```cpp
class Dog : public Mammal {
public:
void speak() {
cout << "Dog barking..." << endl;
}
};
```
可以看到,Dog类重写了基类的speak()函数,使得在调用Dog类对象的speak()函数时输出"Dog barking..."。
接下来,我们定义一个函数,形参使用Mammal的指针或者引用,实参传入Dog类型,观察函数内部speak()的调用情况,如下所示:
```cpp
void test(Mammal& m) {
m.speak();
}
```
现在我们可以创建一个Dog类对象并调用speak()函数,如下所示:
```cpp
Dog dog;
dog.speak(); // 输出 "Dog barking..."
```
我们还可以将Dog类对象传递给test函数,观察内部speak()的调用情况,如下所示:
```cpp
Dog dog;
test(dog); // 输出 "Dog barking..."
```
可以看到,无论是通过Dog类对象直接调用speak()函数,还是通过基类指针或引用调用test函数来调用speak()函数,都会输出"Dog barking...",这是因为在Dog类中重写了基类的speak()函数。