以下代码的错误在哪里:#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; }
时间: 2024-03-23 16:40:29 浏览: 50
以下是代码中的错误:
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`,并重写了基类中的纯虚函数 `Speak()`。
在 `main()` 函数中,首先创建了一个 `Dog` 类的对象 `d`,并调用了 `d.Speak()` 函数打印了一句话。
接着定义了一个 `Mammal` 类型的指针变量 `dp`,并将其指向 `d` 对象。然后通过 `dp->Speak()` 调用 `Speak()` 函数,因为 `dp` 是一个指向基类 `Mammal` 的指针,而基类中的 `Speak()` 函数是一个纯虚函数,因此会调用派生类 `Dog` 中的实现函数。因此程序的输出结果中,两次调用 `Speak()` 函数都打印了狗在叫的信息。
使用C++完整写出以下代码:编写一个哺乳动物类Mammal,再由此派生出狗类Dog,二者都声明speak()成员函数,该函数在基类中被声明为虚函数。声明一个Dog类的对象,通过此对象调用speak函数,观察运行结果。再设计一个函数,形参使用Mammal的指针或者引用,实参传入Dog类型,观察函数内部speak()的调用情况。
以下是代码实现:
```cpp
#include <iostream>
using namespace std;
class Mammal {
public:
virtual void speak() {
cout << "Mammal is speaking" << endl;
}
};
class Dog : public Mammal {
public:
void speak() {
cout << "Dog is barking" << endl;
}
};
void test(Mammal& m) {
m.speak();
}
int main() {
Dog d;
d.speak();
Mammal* m = &d;
test(*m);
return 0;
}
```
输出结果为:
```
Dog is barking
Dog is barking
```
可以看到,调用`Dog`对象的`speak()`函数时,输出了"Dog is barking",符合预期。在调用`test()`函数时,将`Dog`类型的对象传入,由于函数形参使用`Mammal`的引用,因此会自动进行类型转换,然后调用`Mammal`类中声明的虚函数`speak()`,由于`Dog`类覆盖了该函数,因此会调用`Dog`类中的`speak()`函数,输出了"Dog is barking"。
阅读全文