定义抽象基类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;//用指针建立动态关联
	
}
int main(){
	//调用输出函数
	printArea();
	return 0;
}

运行结果1

在这里插入图片描述

实验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;
}
int main(){
	//调用输出函数
	printArea();
	return 0;
}

运行结果2

在这里插入图片描述

总结

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

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

82年苏打

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值