c++虚函数继承

定义抽象基类Shape,由它派生出3个派生类:Circle(圆形)、Rectangle( 长方形)、和Triangle (三角形),用虚函数分别计算面积。编写求面积和函数double TotalArea (const vector<Shape *> &),该函数利用基类指针向量,它的每一个元素指向一个派生类的图形对象。编写测试解释器,读入各种图形信息,动态生成各种图形对象,由vector<Shape *>管理。利用求面积虚函数,输出面积总和,要求正确释放空间。PI取3.1416。内存泄漏最多扣20%

输入描述

circle 后跟半径 rectangle后跟长和宽 triangle后跟三条边

输出描述

结果保留小数点后4位

样例输入

circle 5.2 circle 6.0
rectangle 3.4 2
triangle 3 4 5
rectangle 4.4 10

样例输出

254.8465

参考代码

#include <iostream>
#include <vector>
#include <iomanip>
#include <cmath>
#include <string>
using namespace std;

const	double	PI = 3.1416;
class	CShape {
public :
	virtual	double	GetArea () const = 0;
    virtual ~CShape() {}
};
class	CCircle : public CShape {
	double	m_radius;
public :
	CCircle (double radius);
	virtual	double	GetArea () const;
};

CCircle::CCircle (double radius) : m_radius (radius) {}
double	CCircle::GetArea  () const{
	return PI * m_radius * m_radius;
}

class	CTriangle : public CShape {
	double	m_a, m_b, m_c;
public :
	CTriangle (double a, double b, double c);
	virtual	double	GetArea () const;
};

CTriangle::CTriangle (double a, double b, double c) : m_a (a), m_b(b), m_c (c) {}
double	CTriangle::GetArea () const {
	return sqrt ((m_a+m_b+m_c) * (m_a+m_b-m_c) * (m_a+m_c-m_b) * (m_b+m_c-m_a)) /4.0;
}

class	CRectangle : public CShape {
	double	m_a, m_b;
public :
	CRectangle (double a, double b);
	virtual	double	GetArea () const;
};

CRectangle::CRectangle (double a, double b) : m_a (a), m_b(b) {}
double	CRectangle::GetArea () const {
	return m_a * m_b;
}

double  TotalArea (const vector<CShape *>	&vecShapes)
{
    double  dSum = 0;
    for (unsigned int i = 0; i < vecShapes.size (); ++ i) {
        dSum += vecShapes [i]->GetArea ();
    }
    return dSum;
}
int main()
{
	vector<CShape *>	vecShapes;
	string	strShape;

	while (cin >> strShape) {
		if (strShape == "circle") {
			double	radius;
			cin >> radius;
			vecShapes.push_back (new CCircle (radius));
		} else if (strShape == "triangle") {
			double	a,b,c;
			cin >> a>>b>> c;
			vecShapes.push_back (new CTriangle (a,b,c));
		} else if (strShape == "rectangle") {
			double	a,b;
			cin >> a>>b;
			vecShapes.push_back (new CRectangle (a,b));
		} else {
		}
	}

	cout << fixed << setprecision (4) << TotalArea (vecShapes) << endl;

	for (unsigned int i = 0; i < vecShapes.size (); i++) {
		delete vecShapes[i];
	}
	return 0;
}


我的卑微的代码

#include<bits/stdc++.h>
using namespace std;
class Shape{

public:
virtual double totalarea()const=0 ;
virtual ~Shape(){
}
}; 
class circle : public Shape{
	private:double  R;
	public:
	circle(double r): R(r){
	}	
	~circle(){
	}
	double  totalarea()const 
	{
		return R*R*3.1416;
	}
};
class rectangle : public Shape{
	private: double a,b;
	public:
	rectangle(double x,double y):a(x),	b(y){
		
	}
	~rectangle()
	{
		
	}
	double totalarea()const 
	{
		return a*b;
	}
	
};
class triangle : public Shape{
	private: double a,b,c;
	public:
	triangle(double x,double y ,double z):a(x),b(y),c(z){
		
	}	
	~triangle(){
		
	}
	double totalarea()const 
	{
		double p=(a+b+c)/2;
		return sqrt(p*(p-a)*(p-b)*(p-c));
	}
};
void  ans(const vector<Shape*>&t)
{
	double sum=0;
	for(int i=0;i<t.size();i++)
	{
		sum+=t[i]->totalarea();
	}
	printf("%.4f",sum);
}
int main()
{
	vector<Shape *>p;
	string s;
	double a,b,c;
	while(cin>>s)
	{

		if(s=="circle")
		{
			cin>>a;
            p.push_back(new circle(a));
		}else if(s=="rectangle")
		{
			cin>>a>>b;
			p.push_back(new rectangle(a,b));
		}else 
		{
			cin>>a>>b>>c;
			p.push_back(new triangle(a,b,c));
		}
	}
	ans(p);
	for(int i=p.size()-1;i>=0;i--)
	{
		delete p[i];
	}
	return 0;
}

感觉宽容自己就是罪恶的开始。。。。
老师写的智能指针版的

#include <iostream>
#include <vector>
#include <iomanip>
#include <cmath>
#include <string>
#include <memory>
using namespace std;

const	double	PI = 3.1416;
class	CShape {
public :
	virtual	double	GetArea () const = 0;
    virtual ~CShape() {}
};
class	CCircle : public CShape {
	double	m_radius;
public :
	CCircle (double radius);
	virtual	double	GetArea () const;
};

CCircle::CCircle (double radius) : m_radius (radius) {}
double	CCircle::GetArea  () const{
	return PI * m_radius * m_radius;
}

class	CTriangle : public CShape {
	double	m_a, m_b, m_c;
public :
	CTriangle (double a, double b, double c);
	virtual	double	GetArea () const;
};

CTriangle::CTriangle (double a, double b, double c) : m_a (a), m_b(b), m_c (c) {}
double	CTriangle::GetArea () const {
	return sqrt ((m_a+m_b+m_c) * (m_a+m_b-m_c) * (m_a+m_c-m_b) * (m_b+m_c-m_a)) /4.0;
}

class	CRectangle : public CShape {
	double	m_a, m_b;
public :
	CRectangle (double a, double b);
	virtual	double	GetArea () const;
};

CRectangle::CRectangle (double a, double b) : m_a (a), m_b(b) {}
double	CRectangle::GetArea () const {
	return m_a * m_b;
}

double  TotalArea (const vector<unique_ptr<CShape>>	&vecShapes)
{
    double  dSum = 0;
    for (unsigned int i = 0; i < vecShapes.size (); ++ i) {
        dSum += vecShapes [i]->GetArea ();
    }
    return dSum;
}
int main()
{
	vector<unique_ptr<CShape> >	vecShapes;
	string	strShape;

	while (cin >> strShape) {
		if (strShape == "circle") {
			double	radius;
			cin >> radius;
			unique_ptr<CShape> ptrCircle (new CCircle (radius));
			vecShapes.push_back (std::move (ptrCircle));
		} else if (strShape == "triangle") {
			double	a,b,c;
			cin >> a>>b>> c;
			unique_ptr<CShape> ptrTriangle (new CTriangle (a,b,c));
			vecShapes.push_back (std::move (ptrTriangle));
		} else if (strShape == "rectangle") {
			double	a,b;
			cin >> a>>b;
			vecShapes.push_back (unique_ptr<CShape> (new CRectangle (a,b)));
		} else {
		}
	}

	cout << fixed << setprecision (4) << TotalArea (vecShapes) << endl;

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值