关于多态的问题

今天的上机课有一题比较困惑的地方,刚好老师在课上也讲了,就拿出来分享下。

题目的大意是要我们利用虚函数实现多态。

接下来是代码:


#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;
}

原文地址:https://www.cnblogs.com/zxlmhh/p/5604312.html