12月测试题:6.计算面积和(虚函数的使用)

**
圆类Circle有如下数据成员和成员函数:圆心坐标、半径、面积函数、输出函数(即输出圆心坐标和半径信息)、相应构造函数
矩形类Rect有如下数据成员和成员函数:左上角顶点、宽、高、面积函数、输出函数(即输出顶点坐标、宽和高信息)、相应构造函数
基于继承性思想,设计上述两个类的共同父类Shape,并基于父类实现上述两个类。
基于上述两个类,实现1个圆对象和1个矩形对象的面积总和计算并输出,输出这2个对象的信息。
圆周率用3.1415926参与计算。**
前置代码:

#include <iostream>
using namespace std;
class Shape
{
protected:
	double x,y;
public:
	Shape(double a=0.0,double b=0.0)
	{x=a;y=b;}

后置代码:

int main()
{	
    double m,e,f;
    cin>>m>>e>>f;
	Circle c1(100,100,m);
	Rect r1(50,50,e,f);	
	Shape *s1=&c1,*s2=&r1;
	s1->Show();	
	s2->Show();
	cout<<"面积和="<<s1->area()+s2->area()<<endl;	
	return 0;
}

分析:由于前后置代码已经给定
看main函数可以得知 他希望基类指针能调用在子类中重写后的函数
那就需要使基类中被重写的函数为虚函数,这样就可以实现调用了

题解为

#include <iostream>
using namespace std;
class Shape
{
protected:
	double x,y;
public:
	Shape(double a=0.0,double b=0.0)
	{x=a;y=b;}
	virtual void Show()//重点就在这,由于main中的s1s2都是基类Shape类的, 
	{//因此如果不添加virtual使这里的函数为虚的话就无法调用子类中重写后的show 
		cout<<x<<","<<y;
	}
	virtual double area()=0;//这里同理,基类中没有的就以纯虚函数的形式写出来 
};
double pi=3.1415926;
class Circle :public Shape
{//在两个子类中没什么特别的,照常写  难点在于虚函数 
	public:
		double r;
		Circle(double a,double b,double c):Shape(a,b)
		{
			r=c;
		}
		void Show()
		{
			cout<<"圆心=";
			Shape::Show();
			cout<<",半径="<<r<<endl;
		}
		double area()
		{
			return pi*r*r;
		}
		
};
class Rect :public Shape
{
	public:
		double a1,b1;
		Rect(double a,double b,double c,double d):Shape(a,b)
		{
			a1=c;b1=d;
		}
		void Show()
		{
			cout<<"左上角顶点=";
			Shape::Show();
			cout<<",宽="<<a1<<",高="<<b1<<endl;
		}
		double area()
		{
			return a1*b1;
		}
};
int main()
{	
    double m,e,f;
    cin>>m>>e>>f;
	Circle c1(100,100,m);
	Rect r1(50,50,e,f);	
	Shape *s1=&c1,*s2=&r1;
	s1->Show();	
	s2->Show();
	cout<<"面积和="<<s1->area()+s2->area()<<endl;	
	return 0;
}

发布了28 篇原创文章 · 获赞 12 · 访问量 3809

猜你喜欢

转载自blog.csdn.net/q767410241/article/details/84845053