题目要求
写一个程序,定义抽象基类 Shape,由它派生出5个派生类:Circle(圆形)、Square(正方形)、Rectangle(矩形)、Trapezoid(梯形)、Triangle(三角形)。用虚函数分别计算几种图形面积,并求它们的和。要求用基类指针数组,使它每一个元素指向一个派生类对象。
——谭浩强的《C++面向对象程序设计》第6章习题第5小题
抽象类
带有纯虚函数的类就是抽象类。
例如:
// 定义抽象基类 class Shape { public: virtual double area() const = 0; // 定义纯虚函数 // 在成员函数后面加 const ,表示常量成员函数,不修改对象里任何成员变量的值 };
虚函数
虚函数,就是在基类声明函数是虚拟的,在派生类中才正式定义的函数。虚函数的作用就是在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。
虚函数声明格式:
virtual <返回类型> <函数名> (<参数表>) {<函数体>}
例如:
virtual double area() const // 计算圆形面积 { return 3.14159 * radius * radius; }
基类指针数组
例如:
Shape *pt[5] = { &circle, &square, &rectangle, &trapezoid, &triangle }; // 定义基类指针数组 pt,使它每一个元素指向一个派生类对象
程序
/* ************************************************************************* @file: main.cpp @date: 2020.12.11 @author: Xiaoxiao @brief: 计算圆形、正方形、矩形、梯形和三角形的图形面积,并求和 @blog: https://blog.csdn.net/weixin_43470383/article/details/110942639 ************************************************************************* */ #include <iostream> using namespace std; // 定义抽象基类 class Shape { public: virtual double area() const = 0; // 定义纯虚函数 // 在成员函数后面加 const ,表示常量成员函数,不修改对象里任何成员变量的值 }; // 定义 Circle 类 class Circle : public Shape { public: Circle(double r):radius(r) {}; // 定义构造函数 virtual double area() const // 计算圆形面积 { return 3.14159 * radius * radius; } private: double radius; // 圆形半径 }; // 定义 Square 类 class Square : public Shape { public: Square(double l) :length(l) {}; // 定义构造函数 virtual double area() const // 计算正方形面积 { return length * length; } private: double length; // 正方形边长 }; // 定义 Rectangle 类 class Rectangle :public Shape { public: Rectangle(double w, double h) :width(w), height(h) {}; // 定义构造函数 virtual double area() const // 计算三角形面积 { return width * height; } private: double width, height; }; // 定义 Trapezoid 类 class Trapezoid : public Shape { public: Trapezoid(double t, double b, double h) :top(t), bottom(b), height(h) {}; // 定义构造函数 virtual double area() const // 计算梯形面积 { return 0.5 * (top + bottom) * height; } private: double top, bottom, height; // 梯形的顶边、底边、高 }; // 定义 Triangle 类 class Triangle :public Shape { public: Triangle(double w, double h) :width(w), height(h) {}; // 定义构造函数 virtual double area() const // 计算三角形面积 { return 0.5 * width * height; } private: double width, height; }; int main() { Circle circle(4); // 建立 Circle 类对象 circle Square square(3.5); // 建立 Square 类对象 square Rectangle rectangle(2.5, 6.4); // 建立 Rectangle 类对象 rectangle Trapezoid trapezoid(2.0, 4.2, 3.5); // 建立 Trapezoid 类对象 trapezoid Triangle triangle(4.0, 8.8); // 建立 Triangle 类对象 triangle Shape *pt[5] = { &circle, &square, &rectangle, &trapezoid, &triangle }; // 定义基类指针数组 pt,使它每一个元素指向一个派生类对象 double areas = 0.0; // 总面积 for (int i = 0; i < 5; i++) { areas = areas + pt[i]->area(); } cout << "Totol area = " << areas << endl; // 输出总面积 system("pause"); return 0; }
设圆的半径为4,正方形边长为3.5,矩形宽为2.5、高为6.4,梯形顶边为2.0、底边为4.2、高为3.5,三角形底边为4、高为8.8.
计算圆形、正方形、矩形、梯形和三角形的总面积
运行结果
输出:
Totol area = 106.965
总面积为106.965