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

实验1

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

代码1

#include<iostream>
#include<cmath>
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<<pt->area()<<endl;//用指针建立动态关联
	pt=&re;//指针指向Rectangle类对象
	re.Tname();//静态关联
	cout<<pt->area()<<endl;//用指针建立动态关联
	pt=&tr;//指针指向Triangle类对象
	tr.Tname();//静态关联
	cout<<pt->area()<<endl;//用指针建立动态关联
	
}
main(){
	//调用输出函数
	printArea();
}

运行结果1

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

实验2

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

代码2

#include<iostream>
#include<cmath>
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;i<n;i++){
		pt[i]->Tname();//用指针建立动态关联
		cout<<pt[i]->area()<<endl;//输出面积
		sumarea+=pt[i]->area();
	}
	cout<<" The sum of the areas is: "<<sumarea<<endl;
}
main(){
	//调用输出函数
	printArea();
}

运行结果2

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

总结

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

上一篇:OSPF综合实验


下一篇:11. 盛最多水的容器