第十二周实验
- 格式:doc
- 大小:40.00 KB
- 文档页数:4
第十二周实验
1. 上机分析下面程序,掌握抽象类、纯虚函数以及动态绑定。
// shape.h 文件 定义抽象基类Shape
#ifndef SHAPE_H
#define SHAPE_H
#include
class Shape
{
public:
virtual double Area() const
{
return 0.0;
}
// 纯虚函数,在派生类中重载
virtual void PrintShapeName() const = 0;
virtual void Print() const = 0;
};
#endif
// point.h 文件 定义类Point
#ifndef POINT_H
#define POINT_H
#include "shape.h"
class Point : public Shape
{
int x, y; //点的x 和y 坐标
public:
Point( int = 0, int = 0 ); // 构造函数
void SetPoint( int a, int b ); // 设置坐标
int GetX() const // 取x 坐标
{
return x;
}
int GetY() const // 取y 坐标
{
return y;
}
virtual void PrintShapeName() const
{
cout << "Point: ";
}
virtual void Print() const; //输出点的坐标
};
#endif
// Point.cpp 文件 Point 类的成员函数定义
#include
#include "point.h"
Point::Point( int a, int b ) : x( a ), y( b )
{}
void Point::SetPoint( int a, int b )
{
x = a;
y = b;
}
void Point::Print() const
{
cout << '[' << x << ", " << y << ']';
}
// circle.h 定义类Circle
#ifndef CIRCLE_H
#define CIRCLE_H
#include
#include "point.h"
class Circle : public Point
{
double radius;
public:
Circle(int x = 0, int y = 0, double r = 0.0);
void SetRadius( double r ); //设置半径
double GetRadius() const; //取半径
virtual double Area() const; //计算面积a
virtual void Print() const; //输出圆心坐标和半径
virtual void PrintShapeName() const
{
cout << "Circle: ";
}
};
#endif
// circle.cpp 文件 circle 类的成员函数定义
#include "circle.h"
Circle::Circle(int a,int b,double r): Point(a,b), radius( r )
{
}
void Circle::SetRadius( double r )
{
radius = ( r >= 0 ? r : 0 );
}
double Circle::GetRadius() const
{
return radius;
}
double Circle::Area() const
{
return 3.14159 * radius * radius;
}
void Circle::Print() const
{
cout << "Center = ";
Point::Print();
cout << "; Radius = " << radius << endl;
}
//main.cpp 文件演示图形类
#include
#include "shape.h"
#include "point.h"
#include "circle.h"
void virtualViaPointer( const Shape * );
void virtualViaReference( const Shape & );
int main()
{
//创建point、circle 对象
Point point(30,50);
Circle circle(120,80,10.0);
//输出point、circle、rectangle 对象信息
point.PrintShapeName();
point.Print();
cout << endl;
circle.PrintShapeName();
circle.Print();
//定义基类对象指针
Shape *arrayOfShapes[2];
arrayOfShapes[ 0 ] = &point;
arrayOfShapes[ 1 ] = &circle;
//通过基类对象指针访问派生类对象
cout << "Virtual function calls made off " << "base-class pointers\n";
for ( int i = 0; i < 2; i++ )
virtualViaPointer( arrayOfShapes[ i ] );
cout << "Virtual function calls made off " << "base-class references\n";
for ( int j = 0; j < 2; j++ )
virtualViaReference( *arrayOfShapes[ j ] );
return 0;
}
//通过基类对象指针访问虚函数实现动态绑定
void virtualViaPointer( const Shape *baseClassPtr )
{
baseClassPtr->PrintShapeName();
baseClassPtr->Print();
cout << "Area = " << baseClassPtr->Area() << endl;
}
//通过基类对象引用访问虚函数实现动态绑定
void virtualViaReference( const Shape &baseClassRef )
{
baseClassRef.PrintShapeName();
baseClassRef.Print();
cout << "Area = " << baseClassRef.Area() << endl;
}
实验练习题
1.设计一个抽象类及其子类,可以计算2种以上图形的面积(例如圆形和多边形,可百度海伦
公式).
2. 假设有三个类型数组(各含10个数据)需要进行排序:int,double和string.
请利用函数模板编程实现.其中包括数据成员T b[n]以及对其进行排序的成员函数
sort( ),模板参数T可实例化成字符串。