#include <iostream> using namespace std; class Mammal{ public: virtual void Speak()=0; }; class Dog:public Mammal{ public: void Speak(){ cout<<"狗在叫!:("<<endl; } }; int main(){ Dog d; //Dog类的对象d d.Speak(); cout<<"------------------------"<<endl; Mammal *dp = &d; dp->Speak(); }解释该程序的执行结果
时间: 2024-01-12 10:02:35 浏览: 75
这段程序的执行结果为:
```
狗在叫!:(
------------------------
狗在叫!:(
```
程序中定义了一个抽象基类 `Mammal`,其中包含了一个纯虚函数 `Speak()`。然后定义了一个派生类 `Dog`,并重写了基类中的纯虚函数 `Speak()`。
在 `main()` 函数中,首先创建了一个 `Dog` 类的对象 `d`,并调用了 `d.Speak()` 函数打印了一句话。
接着定义了一个 `Mammal` 类型的指针变量 `dp`,并将其指向 `d` 对象。然后通过 `dp->Speak()` 调用 `Speak()` 函数,因为 `dp` 是一个指向基类 `Mammal` 的指针,而基类中的 `Speak()` 函数是一个纯虚函数,因此会调用派生类 `Dog` 中的实现函数。因此程序的输出结果中,两次调用 `Speak()` 函数都打印了狗在叫的信息。
相关问题
以下代码的错误在哪里:#include<iostream> using namespace std; class Mammal{ public: virtual void speak() { cout<<"什么动物怎么叫?"<<endl; } }; class Dog:public Mammal{ public: void speak() { Mammal::speak();//调用基类函数 cout<<"小狗:汪~~汪~汪 "<<endl; } }; void newspeak(Mammal*a) { a->speak(); } int main() { Dog dog; dog.speak(); Mammal*a=dog; newspeak(*a); return 0; }
以下是代码中的错误:
1. 在代码中,将`dog`对象赋值给了一个`Mammal`类型的指针`a`,语法错误,应该将`&dog`取地址赋值给`a`。
2. 在`newspeak`函数中,形参应该是一个`Mammal`类型的指针或引用,而不是指针的指针。
修改后的代码如下:
```cpp
#include<iostream>
using namespace std;
class Mammal{
public:
virtual void speak(){
cout << "什么动物怎么叫?" << endl;
}
};
class Dog:public Mammal{
public:
void speak(){
Mammal::speak();//调用基类函数
cout << "小狗:汪~~汪~汪 " << endl;
}
};
void newspeak(Mammal* a) {
a->speak();
}
int main() {
Dog dog;
dog.speak();
Mammal* a = &dog;
newspeak(a);
return 0;
}
```
输出结果为:
```
什么动物怎么叫?
小狗:汪~~汪~汪
什么动物怎么叫?
小狗:汪~~汪~汪
```
可以看到,修改后的代码运行正常,符合预期。
#include <iostream> using namespace std; class Mammal{ public: virtual void Speak()=0; }; class Dog:public Mammal{ public: void Speak(){ cout<<"狗在叫!:("<<endl; } }; int main(){ Dog d; //Dog类的对象d d.Speak(); cout<<"------------------------"<<endl; Mammal *dp = &d; dp->Speak(); }解释程序执行结果
这段程序的执行结果如下:
```
狗在叫!:(
------------------------
狗在叫!:(
```
程序中定义了一个抽象基类 `Mammal`,其中有一个纯虚函数 `Speak()`。然后,程序中定义了一个派生类 `Dog`,它继承自 `Mammal` 并实现了 `Speak()` 函数。
接着,程序中创建了一个 `Dog` 类型的对象 `d`,调用了 `d` 的 `Speak()` 函数,输出了 `狗在叫!:(`。
然后,程序中定义了一个指向 `Mammal` 类型的指针 `dp`,将其指向 `d`,再通过 `dp` 调用了 `Speak()` 函数,输出了同样的内容 `狗在叫!:(`。
由于 `Mammal` 类中的 `Speak()` 函数是纯虚函数,因此 `Mammal` 类是一个抽象基类,不能被实例化。因此,只能通过派生类 `Dog` 来实现 `Mammal` 类的纯虚函数,这也是多态的一种体现,即通过派生类对象来调用基类中的纯虚函数,实现多态性的目的。
所以,程序执行结果符合预期。
阅读全文