定义抽象基类Shape由他派生出n个派生类,用一个printArea分别输出派生类的面积,派生类的数据定义对象时给定

定义抽象基类Shape由他派生出n个派生类,用一个printArea分别输出派生类的面积,派生类的数据定义对象时给定,第1张

定义抽象基类Shape由他派生出n个派生类,用一个printArea分别输出派生类的面积,派生类的数据定义对象时给定 实验1

写一个程序,定义抽象基类Shape,由他派生出三个派生类:Circle(圆形)、Rectangle(矩形)、Triangle(三角形),用一个函数printArea分别输出以上三者的面积,三个图形的数据在定义对象时给定

代码1
#include
#include
using namespace std;
#define n 3
//使用宏定义或者const都行
//const int n=3;
class Shape{
	public:
		//成员函数后面用 const 修饰,const表示this是一个指向常量的指针,
		//即对象成为一个常量,即它的成员不能够变化.
		virtual double area()const{
			return 0.0;
		} 
		//一个类里如果包含 =0 的纯虚函数,那么这个类就是一个抽象类,它不能具体实例化(不能创建它的对象),而只能由它去派生子类
		virtual void Tname()const=0;
};
class Circle:public Shape{
	public:
		Circle();//无参构造
		Circle(double r):radius(r){}//带参构造
		//对虚函数进行再定义
		//这里没有加virtual,不加的话系统会默认加上
		double area()const{
			return 3.14*pow(radius,2);
		}
		void Tname()const{
			cout<<"Circle:";
		}
	private:
		double radius;
};
class Rectangle:public Shape{
	public:
		Rectangle();
		Rectangle(double h,double w):high(h),wide(w){}
		//这里对虚函数进行再定义
		virtual double area()const{
			return high*wide;
		}
		virtual void Tname()const{
			cout<<"Rectangle";
		}
	private:
		double high,wide;
};
class Triangle:public Shape{
	public:
		Triangle();
		Triangle(double b,double h){
			base=b;
			high=h;
		}
		double area()const{
			return high*base/2;
		}
		void Tname()const{
			cout<<"Triangle:";
		}
	private:
		double high,base;
};
void printArea(){
	Circle c(2);
	Rectangle re(2.5,3.25);
	Triangle tr(3.3,4.7);
	Shape *pt;//定义基类指针
	pt=&c;//指针指向Circle类对象
	c.Tname();//静态关联
	cout<area()<area()<area()< 
运行结果1 

实验2

写一个程序,定义抽象基类Shape,由他派生出三个派生类:Square(正方形)、Trapezoid(梯形)、Triangle(三角形)。用虚函数分别计算几种图形的面积,并求他们的和。要求使用基类指针数组,是它的每一个元素指向一个派生类对象。

代码2
#include
#include
using namespace std;
//#define n 3
//使用宏定义或者const都行
const int n=3;
class Shape{
	public:
		//成员函数后面用 const 修饰,const表示this是一个指向常量的指针,
		//即对象成为一个常量,即它的成员不能够变化.
		virtual double area()const{
			return 0.0;
		} 
		//一个类里如果包含 =0 的纯虚函数,那么这个类就是一个抽象类,它不能具体实例化(不能创建它的对象),而只能由它去派生子类
		virtual void Tname()const=0;
};
class Square:public Shape{
	public:
		Square();//无参构造
		Square(double s):square(s){}//带参构造
		//对虚函数进行再定义
		//这里没有加virtual,不加的话系统会默认加上
		double area()const{
			return pow(square,2);
		}
		void Tname()const{
			cout<<" Square: ";
		}
	private:
		double square;
};
class Trapezoid:public Shape{
	public:
		Trapezoid();
		//声明带参构造函数
		Trapezoid(double h,double b1,double b2);
		//这里对虚函数进行再定义
		virtual double area()const{
			return high*(base1+base2)/2;
		}
		virtual void Tname()const{
			cout<<" Trapezoid: ";
		}
	private:
		double high,base1,base2;
};
//类外定义带参构造函数
Trapezoid::Trapezoid(double h,double b1,double b2):high(h),base1(b1),base2(b2){}
class Triangle:public Shape{
	public:
		Triangle();
		Triangle(double b,double h){
			base=b;
			high=h;
		}
		double area()const{
			return high*base/2;
		}
		void Tname()const{
			cout<<" Triangle: ";
		}
	private:
		double high,base;
};
void printArea(){
	Square sq(2.5);
	Trapezoid tra(2,3.25,5.5);
	Triangle tri(3.3,4.7);
	Shape *pt[n]={&sq,&tra,&tri};//定义基类指针数组并指向各个对象
	double sumarea=0;//定义面积总和
	for(int i=0;iTname();//用指针建立动态关联
		cout<area()<area();
	}
	cout<<" The sum of the areas is: "< 
运行结果2 

总结

这两个实验考察的知识点有对多态性的了解,虚函数的作用及其用法,静态关联和动态关联的概念和用法,如何定义和使用纯虚函数和抽象类

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5671005.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存