C++虚继承练习

#define _USE_MATH_DEFINES
#include <iostream>
#include <string>
#include <cmath>


#define PI M_PI

class Graph
{
	public:
		Graph()
		{
		}
		
	
		
		virtual ~Graph()
		{}
		
		
		virtual double get_area() = 0;
		virtual double get_perimeter() = 0;
		virtual void show() = 0;
		
	protected:
		double area = 0;
		double perimeter = 0;
	
};


class Rectangle:public virtual Graph
{
		public:
		Rectangle()
		{
			len = 0;
			high = 0;
		}
		
		Rectangle(double len, double high)
		:len(len), high(high)
		{
			area = len * high;
			perimeter = (len + high) * 2;
		}
		
		Rectangle(const Rectangle &other):
		len(other.len), high(other.high)
		{
			area = other.area;
			perimeter = other.perimeter;
		}
		
		~Rectangle()
		{}
		
		
		inline double get_area() override
		{
			return area;
		}
		inline double get_perimeter() override
		{
			return perimeter;
		}
		
		void show()
		{
			std::cout << "图形为矩形" << std::endl;
			std::cout << "length = " << len << std::endl;
			std::cout << "high = " << high << std::endl;
			std::cout << "area = " << area << std::endl;
			std::cout << "perimeter = " << perimeter << std::endl;
		}
		
	private:
		double len;
		double high;
	
};



class Round:public virtual Graph
{
		public:
		Round()
		{
			radius = 0;
		}
		
		Round(double radius)
		:radius(radius)
		{
			area = PI * radius * radius;
			perimeter = 2 * PI * radius;
		}
		
		Round(const Round &other):
		radius(other.radius)
		{
			area = other.area; 
			perimeter = other.perimeter;
		}
		
		~Round()
		{}
		
		
		inline double get_area() override
		{
			return area;
		}
		inline double get_perimeter() override
		{
			return perimeter;
		}
		
		void show()
		{
			
			std::cout << "图形为圆形" << std::endl;
			std::cout << "radius = " << radius << std::endl;
			std::cout << "area = " << area << std::endl;
			std::cout << "perimeter = " << perimeter << std::endl;
		}
		
	private:
		double radius;
	
};






class Triangle:public virtual Graph
{
		public:
		Triangle()
		{
			len1 = 0;
			len2 = 0;
			len3 = 0;
		}
		
		Triangle(double len1, double len2, double len3)
		:len1(len1), len2(len2), len3(len3)
		{
			if((len1 + len2) < len3 || (len1 - len2) >len3 || (len2 - len1) >len3)
			{	
				std::cout << "该三条边不能组成一个三角形" << std::endl;
				Triangle();
			}
			else
			{
				perimeter = len1 + len2 + len3;
				double p = perimeter / 2;
				area = sqrt(p * (p - len1) * (p - len2) * (p - len3));
			}
		}
		
		Triangle(const Triangle &other):
		len1(other.len1), len2(other.len2), len3(other.len3)
		{
			area = other.area;
			perimeter = other.perimeter;
		}
		
		
		Triangle &operator()(double len1, double len2, double len3)
		{
			if((len1 + len2) <= len3 || (len1 - len2) >= len3 || (len2 - len1) >= len3)
			{	
				std::cout << "该三条边不能组成一个三角形" << std::endl;
				return *this;
			}
			else
			{
				this->len1 = len1;
				this->len2 = len2;
				this->len3 = len3;
				perimeter = len1 + len2 + len3;
				double p = perimeter / 2;
				area = sqrt(p * (p - len1) * (p - len2) * (p - len3));
			}
		}
		
		~Triangle()
		{}
		
		
		inline double get_area() override
		{
			return area;
		}
		inline double get_perimeter() override
		{
			return perimeter;
		}
		
		void show()
		{
			
			std::cout << "图形为三角形" << std::endl;
			std::cout << "三边长分别为: = " << "\n"
			<< len1 << "\t" << len2 << "\t" <<len3 << std::endl;
			std::cout << "area = " << area << std::endl;
			std::cout << "perimeter = " << perimeter << std::endl;
		}
		
	private:
		double len1;
		double len2;
		double len3;
	
};


void show1(Graph &graph)
{
	graph.show();
}

void show2(Graph &graph)
{
	std::cout << "周长为:" << graph.get_perimeter() << std::endl;
	std::cout << "面积为:" << graph.get_area() << std::endl;
}



int main()
{
	Triangle t(1,2,3);
	t(3,4,5);
	Rectangle rec(10,5);
	Round ric(4);
	show1(t);
	show1(rec);
	show2(ric);
}




















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值