C++ 多态:Shape类层次结构

创建Shape类层次结构

1.创建基类Shape

class Shape
{
public:
	virtual double getArea(){}//计算面积 
	virtual double getVolume(){}//计算体积
	virtual void print(){}//打印 
	Shape(){}//构造 
	~Shape(){}//析构 
		
};

2.创建TwoDimensionalShape类,继承于Shape

class TwoDimensionalShape : public Shape//二维 
{
public:
	TwoDimensionalShape(){}
	virtual double getArea(){}
	virtual double getVolume(){}
	virtual void print(){}
};

3.创建ThreeDimensionalShape类,继承于Shape类

class ThreeDimensionalShape : public Shape//三维 
{
public:
	ThreeDimensionalShape(){}
	virtual double getArea(){}
	virtual double getVolume(){}
	virtual void print(){}
};
4.创建圆形类Circle,正方形类Square,三角形类Triangle,继承于二维类TwoDimensionalShape
class Circle : public TwoDimensionalShape//二维的圆形 
{
public:
	Circle(){}
	Circle(double radius)
	{
		radius_m=radius;
	}
	double getArea()
	{
		return E*radius_m*radius_m;
	}
	double getVolume(){}
	void print()
	{
		cout<<"二维的圆形的面积为:"<<getArea()<<endl;	
	}	
private:
	double radius_m;//圆的半径 
};
class Square : public TwoDimensionalShape//二维的正方形 
{
public:
	Square(){}
	Square(double length,double width)
	{
		length_m=length;
		width_m=width;
	}
	double getArea()
	{
		return length_m*width_m;
	}
	double getVolume(){}
	void print()
	{
		cout<<"二维的正方形的面积为:"<<getArea()<<endl;	
	}
private:
	double length_m;//长 
	double width_m;//宽 
};
class Triangle : public TwoDimensionalShape//二维的三角形 
{
public:
	Triangle(){}
	Triangle(double length,double height)
	{
		length_m=length;
		height_m=height;
	}
	double getArea()
	{
		return 0.5*length_m*height_m;
	}
	double getVolume(){}
	void print()
	{
		cout<<"二维的三角形的面积为:"<<getArea()<<endl;	
	}
private:
	double length_m;//底 
	double height_m;//高 
};
5.创建球类Sphere,立方体类Cube,四面体类Tetrahedron,继承于三维类ThreeDimensionalShape
class Sphere : public ThreeDimensionalShape//三维的球 
{
public:
	Sphere(){}
	Sphere(double radius)
	{
		radius_m=radius;
	}
	double getArea()
	{
		return 4*E*radius_m*radius_m;
	}
	double getVolume()
	{
		return (4/3)*E*radius_m*radius_m*radius_m;
	}
	void print()
	{
		cout<<"三维的球的面积为:"<<getArea()<<endl;
		cout<<"三维的球的体积为:"<<getVolume()<<endl;	
	}
private:
	double radius_m;//球的半径 
};
class Cube : public ThreeDimensionalShape//三维的立方体
{
public:
	Cube(){}
	Cube(double length,double width,double height)
	{
		length_m=length;
		width_m=width;
		height_m=height;
	}
	double getArea()
	{
		return 6*length_m*width_m;
	}
	double getVolume()
	{
		return length_m*width_m*height_m;
	}
	void print()
	{
		cout<<"三维的立方体的面积为:"<<getArea()<<endl;
		cout<<"三维的立方体的体积为:"<<getVolume()<<endl;	
	}
private:
	double length_m;//长 
	double width_m;//宽 
	double height_m;//高 
};
class Tetrahedron : public ThreeDimensionalShape//三维的四面体(三棱锥)在这里我定义它为正四面体 
{
public:
	Tetrahedron(){}
	Tetrahedron(double edge)
	{
		edge_m=edge;
	}
	double getArea()
	{
		return sqrt(3)*edge_m*edge_m;
	}
	double getVolume()
	{
		return (sqrt(2)/12)*pow(edge_m,3);
	} 
	void print()
	{
		cout<<"三维的四面体的面积为:"<<getArea()<<endl;
		cout<<"三维的四面体的体积为:"<<getVolume()<<endl;	
	}
private:
	double edge_m; //棱长 
};

6.测试程序

int main()
{
	//抽象类是不能实例化对象,所以想创建Shape类的vector对象,Shape类就不可以为抽象类 
	vector<Shape*> shapeclass;
	Shape *ptr_Shape=new Shape;
	Shape *ptr_Circle=new Circle(5);
	Shape *ptr_Square=new Square(4,5);
	Shape *ptr_Triangle=new Triangle(6,8);
	Shape *ptr_Sphere=new Sphere(3);
	Shape *ptr_Cube=new Cube(2,2,2);
	Shape *ptr_Tetrahedron=new Tetrahedron(4);
	
	shapeclass.push_back(ptr_Shape);
	shapeclass.push_back(ptr_Circle);
	shapeclass.push_back(ptr_Square);
	shapeclass.push_back(ptr_Triangle);
	shapeclass.push_back(ptr_Sphere);
	shapeclass.push_back(ptr_Cube);
	shapeclass.push_back(ptr_Tetrahedron);
	
	vector<Shape*>::iterator iter;
	for(iter = shapeclass.begin(); iter != shapeclass.end(); ++iter)
    {
        (*iter)->print();
    }
	delete ptr_Shape;
	delete ptr_Circle;
	delete ptr_Square;
	delete ptr_Triangle;
	delete ptr_Sphere;
	delete ptr_Cube;
	delete ptr_Tetrahedron;
	return 0;
}

完整代码如下:

/
//Shape类层次结构
/
#include<iostream>
#include<vector>
#include<math.h>
using namespace std;
#define E 3.14 
//Shape类 
class Shape
{
public:
	virtual double getArea(){}//计算面积 
	virtual double getVolume(){}//计算体积
	virtual void print(){}//打印 
	Shape(){}//构造 
	~Shape(){}//析构 
		
};

class TwoDimensionalShape : public Shape//二维 
{
public:
	TwoDimensionalShape(){}
	virtual double getArea(){}
	virtual double getVolume(){}
	virtual void print(){}
};

class ThreeDimensionalShape : public Shape//三维 
{
public:
	ThreeDimensionalShape(){}
	virtual double getArea(){}
	virtual double getVolume(){}
	virtual void print(){}
};

class Circle : public TwoDimensionalShape//二维的圆形 
{
public:
	Circle(){}
	Circle(double radius)
	{
		radius_m=radius;
	}
	double getArea()
	{
		return E*radius_m*radius_m;
	}
	double getVolume(){}
	void print()
	{
		cout<<"二维的圆形的面积为:"<<getArea()<<endl;	
	}	
private:
	double radius_m;//圆的半径 
};
class Square : public TwoDimensionalShape//二维的正方形 
{
public:
	Square(){}
	Square(double length,double width)
	{
		length_m=length;
		width_m=width;
	}
	double getArea()
	{
		return length_m*width_m;
	}
	double getVolume(){}
	void print()
	{
		cout<<"二维的正方形的面积为:"<<getArea()<<endl;	
	}
private:
	double length_m;//长 
	double width_m;//宽 
};
class Triangle : public TwoDimensionalShape//二维的三角形 
{
public:
	Triangle(){}
	Triangle(double length,double height)
	{
		length_m=length;
		height_m=height;
	}
	double getArea()
	{
		return 0.5*length_m*height_m;
	}
	double getVolume(){}
	void print()
	{
		cout<<"二维的三角形的面积为:"<<getArea()<<endl;	
	}
private:
	double length_m;//底 
	double height_m;//高 
};

class Sphere : public ThreeDimensionalShape//三维的球 
{
public:
	Sphere(){}
	Sphere(double radius)
	{
		radius_m=radius;
	}
	double getArea()
	{
		return 4*E*radius_m*radius_m;
	}
	double getVolume()
	{
		return (4/3)*E*radius_m*radius_m*radius_m;
	}
	void print()
	{
		cout<<"三维的球的面积为:"<<getArea()<<endl;
		cout<<"三维的球的体积为:"<<getVolume()<<endl;	
	}
private:
	double radius_m;//球的半径 
};
class Cube : public ThreeDimensionalShape//三维的立方体
{
public:
	Cube(){}
	Cube(double length,double width,double height)
	{
		length_m=length;
		width_m=width;
		height_m=height;
	}
	double getArea()
	{
		return 6*length_m*width_m;
	}
	double getVolume()
	{
		return length_m*width_m*height_m;
	}
	void print()
	{
		cout<<"三维的立方体的面积为:"<<getArea()<<endl;
		cout<<"三维的立方体的体积为:"<<getVolume()<<endl;	
	}
private:
	double length_m;//长 
	double width_m;//宽 
	double height_m;//高 
};
class Tetrahedron : public ThreeDimensionalShape//三维的四面体(三棱锥)在这里我定义它为正四面体 
{
public:
	Tetrahedron(){}
	Tetrahedron(double edge)
	{
		edge_m=edge;
	}
	double getArea()
	{
		return sqrt(3)*edge_m*edge_m;
	}
	double getVolume()
	{
		return (sqrt(2)/12)*pow(edge_m,3);
	} 
	void print()
	{
		cout<<"三维的四面体的面积为:"<<getArea()<<endl;
		cout<<"三维的四面体的体积为:"<<getVolume()<<endl;	
	}
private:
	double edge_m; //棱长 
};
int main()
{
	//抽象类是不能实例化对象,所以想创建Shape类的vector对象,Shape类就不可以为抽象类 
	vector<Shape*> shapeclass;
	Shape *ptr_Shape=new Shape;
	Shape *ptr_Circle=new Circle(5);
	Shape *ptr_Square=new Square(4,5);
	Shape *ptr_Triangle=new Triangle(6,8);
	Shape *ptr_Sphere=new Sphere(3);
	Shape *ptr_Cube=new Cube(2,2,2);
	Shape *ptr_Tetrahedron=new Tetrahedron(4);
	
	shapeclass.push_back(ptr_Shape);
	shapeclass.push_back(ptr_Circle);
	shapeclass.push_back(ptr_Square);
	shapeclass.push_back(ptr_Triangle);
	shapeclass.push_back(ptr_Sphere);
	shapeclass.push_back(ptr_Cube);
	shapeclass.push_back(ptr_Tetrahedron);
	
	vector<Shape*>::iterator iter;
	for(iter = shapeclass.begin(); iter != shapeclass.end(); ++iter)
    {
        (*iter)->print();
    }
	delete ptr_Shape;
	delete ptr_Circle;
	delete ptr_Square;
	delete ptr_Triangle;
	delete ptr_Sphere;
	delete ptr_Cube;
	delete ptr_Tetrahedron;
	return 0;
}
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 抽象是Java中的一种特殊型的,不能被实例化,只能被其他继承并实现其抽象方法。抽象中可以有非抽象方法,但必须至少有一个抽象方法。抽象常常作为一个如果要实现某些方法,必须先要实现某些其他方法的,或者是一个共同特征较多的的共同抽象。通过继承抽象,子可以获得抽象中定义的变量和方法,同时必须实现所有的抽象方法,才能被实例化。 ### 回答2: Java语言中的继承和多态是其面向对象编程的核心内容之一。而抽象是继承和多态的重要手段。抽象是一种不能被实例化的,它存在的主要目的是为了被子继承。 抽象的主要特征是:包含抽象方法和非抽象方法。抽象方法必须要被子实现,而非抽象方法可以在抽象中有默认的实现。抽象的定义方式是在名前加上abstract关键字,例如: abstract class Animal { ... public abstract void makeSound(); ... } 在这个例子中,Animal是一个抽象,其中包含了一个抽象方法makeSound()。子继承Animal时,需要实现makeSound()方法。抽象的主要作用是为继承层次结构中的相关提供一个通用的父,同时限制抽象的实例化,使得子必须实现抽象方法。 抽象的另一个重要用途是实现多态性。多态性是指同一个方法名在不同的对象中的行为不同。通过抽象多态性,我们可以实现似于“鸟可以飞”的描述,这就是面向对象编程中的多态性。 总之,抽象是Java语言的一个重要机制,它的通过继承和多态性实现层次结构和通用化,同时限制抽象的实例化,强制子必须实现继承结构中通用的抽象方法。在Java程序设计中,了解和掌握抽象的用法和特点是非常重要的。 ### 回答3: 在Java中,abstract是一种特殊的,它不能被实例化,只能被用作其他的父或者作为抽象方法的容器。一般情况下,abstract用于将某些通用行为封装到一个顶级中,以便它们可以在多个派生之间共享。同时,abstract还可以用来定义抽象方法,这些方法没有具体实现,只是提供了一种约定,即任何派生都必须实现这些方法。 Java继承机制允许派生继承父的属性和方法,同时可以重写这些方法和添加新的方法。而多态则是指同一型的实例对象在不同的上下文环境下表现出不同的行为。Java中的abstract多态机制结合使用,可以让程序员更加方便地创建可扩展的应用程序。 通过继承一个abstract,派生可以继承abstract中定义的方法和变量,并在派生中重写这些方法以实现派生的独特功能。同时,派生也可以通过实现抽象方法来实现多态。例如,在一个程序中,有一个Shape,它是一个abstract,其中包含一个抽象方法area(),用于计算图形的面积。由于面积的计算方式在不同的图形中是不一样的,因此派生需要实现这个抽象方法来满足具体的需求。 在Java中,abstract和接口是实现多态的两种主要方式。abstract通常用于表示一具有共同特性的对象,而接口则强调对象之间的方法调用和行为规范。无论是abstract还是接口,它们都可以被用作多态的基础,允许程序员通过简单的代码实现复杂的功能。 总之,abstract是面向对象编程中重要的一环,它是Java中实现继承和多态的重要手段。通过继承一个abstract,并实现其中的抽象方法,Java程序员可以更加方便地开发出可扩展的应用程序。同时,abstract多态机制的结合使用,也为程序员提供了更大的创作空间。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值