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