**
圆类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;
}