C++高手来帮我看个简单题目 问题解答完全,满意再加50分
来源:百度知道 编辑:UC知道 时间:2024/06/13 04:59:11
#include<iostream>
using namespace std;
class Animal{
public:
virtual char * getType() const {return "Animal";}
virtual char * getVoice() const { return " Voice";}
};
class Dog:public Animal{
public:
char *getType() const { return "Dog";}
char *getVoice() const { return "Woof";}
};
void type(Animal &a) {cout<<a.getType();}
void speak(Animal a) {cout<<a.getVoice();}
int main()
{ Dog d;
type(d);
cout<<" speak";
speak(d);
cout<<endl;
return 0;
}
这个题目困扰我有一段时间了,没办法,基础太差。又没有老师可以问的。请各位高手指点一二,不胜感激。如果我懂了,理解了,再加50分,决不食言!谢谢~
其实这里的问题就在这两个类了
基类Animal 子类 Dog
他们里面都有相同的函数(名字相同)
在函数TYPE 和APEAK 里面 都是调用的是类里面的相应的GET 函数
但你要注意 TYPE函数里面是 Animal &a 有个& 表示传递参数的时候传递的是对象a本身 &在这表示的是引用
而 speak 函数里面 Animal a 就没有这个 而传递这个对象a的时候 传递的是他的拷贝对象
这就有不同的结果了 传递对象a的本身的时候 在里面调用它的gettype 就对调用本身的这个函数
而 speak 传递的是a的拷贝函数 调用的时候就会调用 这个对象 Dog 的基类Animal的函数
虽然在函数参数里面都是写的Animal 但在主函数里面 d 是Dog的对象
所以第一个type 会调用Dog的gettpye 而speak会调用 animal的函数
这就是类的多态性 如果我说的你不太明白 你可以着重看看类的多态性 就会明白的了
不懂就问 是好的
如果以后有不懂的 你可以给我发消息 活着到我主页去给我留言 我看到第一时间给你回复 我们相互交流 共同进步
type 的形参是引用,引用就是不能更改原来的数据 animal显然是一个类。他们两个函数的形参就是一个是类的对象的引用,一个是一个类的对象
在C++中要想获得动态绑定实现的多态性功能必须使用引用或指针类型作为形参,而实参为派生类对象,type函数的形参为Animal类型的引用,所以能实现多态性,所以调用派生类的函数,而speak函数为Animal类型的对象,所以调用父类的函数
这种问题也能叫奥妙啊!!
汗.....................
问题不是程序,是设置的事情,看看这个