今天的上机课有一题比较困惑的地方,刚好老师在课上也讲了,就拿出来分享下。
题目的大意是要我们利用虚函数实现多态。
接下来是代码:
#include<iostream>
using namespace std;
class Pet
{
protected:
string name;//姓名
int length;//身长
int weight;//体重
int current;//当前日期
public:
Pet(string a,int b,int c,int d)
{
name=a;
length=b;
weight=c;
current=d;
}
virtual void display(int day)//输出目标日期的身长和体重
{
}
};
class Cat:public Pet
{
public:
Cat(string a,int b,int c,int d)
:Pet(a,b,c,d)
{
}
virtual void display(int day)//输出目标日期的身长和体重
{
int b;
b=day-current;
length=length+b;
weight=weight+2*b;
cout<<name<<" "<<length<<" "<<weight<<endl;
}
};
class Dog:public Pet
{
public:
Dog(string a,int b,int c,int d)
:Pet(a,b,c,d)
{
}
virtual void display(int day)//输出目标日期的身长和体重
{
int b;
b=day-current;
length=length+2*b;
weight=weight+b;
cout<<name<<" "<<length<<" "<<weight<<endl;
}
};
int main()
{
int type,count=0,day;
Pet *pet[10];
while(cin>>type)
{
string a;
int b,c,d;
if(type==1)
{
cin>>a>>b>>c>>d;
pet[count]=new Cat(a,b,c,d); //正确写法
/*重点是在这边!!!
一开始我是这么写的
Cat cat(a,b,c,d);
pet[count]=&cat;
但是这样是错误的,老师说如果这样写的其实pet[count]的类型只是在这个if中为
cat,一旦出去就变回了父类的pet,因为在这里只是随意的指向一个地方,出去后指
针就不懂指向哪里了,就变为了最初始的pet了,所以租后的调用的display函数是pet
的,而不是cat的,所以没输出东西。*/
count++;
}
else if(type==2)
{
cin>>a>>b>>c>>d;
pet[count]=new Dog(a,b,c,d);
count++;
}
else
{
day=type;
break;
}
}
for(int i=0;i<count;i++)
{
pet[i]->display(day);
delete pet[i];
}
return 0;
}