C++ 宠物的生长(虚函数和多态)


一、题目描述

需要开发一个系统,对宠物的生长状态进行管理。给出下面的基类框架:

class Pet

{ protected:

string name;//姓名

float length;//身长

float weight;//体重

CDate current;//开始记录时间

(日期类CDate包含年、月、日三个私有数据,其他方法根据需要自拟。)

public:

virtual void display(CDate day)=0;//输出目标日期时宠物的身长和体重

}

以Pet为基类,构建出Cat和Dog两个类:

Cat一天身长加0.1,体重加0.2。

Dog一天身长加0.2,体重加0.1。

生成上述类并编写主函数,要求主函数中有一个基类指针Pet *pt,用于测试子类数据。

主函数根据输入的信息,相应建立Cat类对象或Dog类对象,并给出测量日期时宠物的身长和体重。


二、输入与输出

1.输入

第一行为测试次数

第二行是开始记录日期

从第三行起,每个测试用例占一行,每行给出宠物的基本信息:宠物的类型(1为Cat,2为Dog)、名字、身长、体重、最后测量的日期。

3
2019 5 5
1 tony 10 10 2018 12 30
2 jerry 5 6 2019 5 10
1 tom 3 4 2019 6 1

2.输出

要求输出目标日期宠物姓名、身长和体重(结果要求保留小数点后2位)。若测量日期小于开始日期,输出”error”。

error
jerry after 5 day: length=6.00,weight=6.50
tom after 27 day: length=5.70,weight=9.40

三、参考代码

#include <iostream>
#include <vector>
#include<string>
#include<cmath>
#include <memory>
#include<iomanip>
using namespace std;
class date
{
private:
	int year, mon, day;
public:
	date(){}
	void set(int y, int m, int d)
	{
		year = y;
		mon = m;
		day = d;
	}
	date(int y, int m, int d)
	{
		year = y;
		mon = m;
		day = d;
	}
	friend int days(const date& a, const date& b)
	{
		const int mons1[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
		const int mons2[12] = { 31,29,31,30,31,30,31,31,30,31,30,31 };
		int ad = a.year * 10000 + a.mon * 1000 + a.day;
		int bd = b.year * 10000 + b.mon * 1000 + b.day;
		if (ad > bd)
		{
			return 0;
		}
		else
		{
			ad = 0;
			bd = 0;
			if (a.year % 400 == 0 || (a.year % 4 == 0 && a.year % 100 != 0))
			{
				for (int i = 0; i < a.mon-1; i++)
				{
					ad += mons2[i];
				}
				for (int i = 0; i < a.mon-1; i++)
				{
					bd += mons2[i];
				}
				ad += a.day;
				bd += b.day;
				return bd - ad;
			}
			else
			{
				for (int i = 0; i < a.mon-1; i++)
				{
					ad += mons1[i];
				}
				for (int i = 0; i < b.mon-1; i++)
				{
					bd += mons1[i];
				}
				ad += a.day;
				bd += b.day;
				return bd - ad;
			}
		}

	}
};
class pet
{
protected:
	string name;
	float len;
	float wei;
	date now;
public:
	pet(string n, float l, float w, date n1)
	{
		name = n;
		len = l;
		wei = w;
		now = n1;
	}
	virtual void display(date day) = 0;
};
class cat :public pet
{
public:
	cat(string n, float l, float w, date n1):pet(n,l,w,n1){}
	void display(date ago)
	{
		int lon = days(ago, now);
		if (lon)
		{
			cout << name << " after " << lon << " day: length=" << fixed << setprecision(2) << len+lon*0.1 << ",weight=" << fixed << setprecision(2) << wei+lon*0.2 << endl;
		}
		else
		{
			cout << "error" << endl;
		}
	}
};
class dog :public pet
{
public:
	dog(string n, float l, float w, date n1) :pet(n, l, w, n1) {}
	void display(date ago)
	{
		int lon = days(ago, now);
		if (lon)
		{
			cout << name << " after " << lon << " day: length=" << fixed << setprecision(2) << len + lon * 0.2 << ",weight=" << fixed << setprecision(2) << wei + lon * 0.1 << endl;
		}
		else
		{
			cout << "error" << endl;
		}
	}
};
int main()
{
	int sum;
	cin >> sum;
	int y, m, d;
	string n;
	int len, wei;
	cin >> y >> m >> d;
	date ago(y, m, d);
	int id;
	pet* pt;
	while (sum--)
	{
		cin >> id;
		cin >> n >> len >> wei;
		cin >> y >> m >> d;
		date now(y, m, d);
		if (id == 1)
		{
			pt = new cat (n, len, wei, now);
			pt->display(ago);
		}
		else
		{
			pt=new dog(n, len, wei, now);
			pt->display(ago);
		}
	}
	

}


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
下面是一个使用C++虚函数实现多态的代码示例: ```cpp #include <iostream> using namespace std; class A { public: virtual void foo() { cout << "A::foo()" << endl; } virtual ~A() { cout << "~A()" << endl; } }; class B : public A { public: void foo() { cout << "B::foo()" << endl; } ~B() { cout << "~B()" << endl; } }; int main() { A* p = new B(); p->foo(); delete p; return 0; } ``` 在这个示例中,类A和类B都有一个名为foo()的虚函数。当我们通过基类指针p调用foo()函数时,实际上会根据指针所指向的对象的类型来确定调用哪个类的foo()函数。这就是多态的实现原理。 输出结果为: ``` B::foo() ~B() ~A() ``` 可以看到,通过虚函数实现的多态,调用的是派生类B的foo()函数,而不是基类A的foo()函数。同时,析构函数也是虚函数,确保在删除指针p时,会先调用派生类B的析构函数,再调用基类A的析构函数。这是因为在C++中,如果基类的析构函数不是虚函数,那么通过基类指针删除派生类对象时,只会调用基类的析构函数,而不会调用派生类的析构函数。因此,为了确保正确的析构顺序,析构函数应该声明为虚函数。 请注意,虚函数只能在类的成员函数中声明,构造函数不能声明为虚函数。这是因为在创建对象时,需要先调用构造函数来初始化对象,而虚函数的机制是在运行时根据对象的类型来确定调用哪个函数,而构造函数在对象创建时就已经确定了。因此,构造函数不能声明为虚函数。 #### 引用[.reference_title] - *1* [虚函数实现多态原理](https://blog.csdn.net/qq_24309981/article/details/89102183)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [C++虚函数多态实现](https://blog.csdn.net/qq_27576655/article/details/124535530)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Z1Jxxx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值