【C++之纯虚函数与抽象类2】计算圆形、正方形、矩形、梯形和三角形的图形面积,并求和

简介: 【C++之纯虚函数与抽象类2】计算圆形、正方形、矩形、梯形和三角形的图形面积,并求和

题目要求


写一个程序,定义抽象基类 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

相关文章
|
1月前
|
C++
C++程序中的纯虚函数
C++程序中的纯虚函数
22 0
|
11天前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-2
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
11天前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-1
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
1月前
|
Serverless C++
C++多态性、虚函数、纯虚函数和抽象类知识网络构造
C++多态性、虚函数、纯虚函数和抽象类知识网络构造
|
25天前
|
数据安全/隐私保护 C++
C++中的虚函数、纯虚函数与函数重写的技术性探讨
C++中的虚函数、纯虚函数与函数重写的技术性探讨
33 0
|
1月前
|
C++
C++|多态性与虚函数(2)|虚析构函数|重载函数|纯虚函数|抽象类
C++|多态性与虚函数(2)|虚析构函数|重载函数|纯虚函数|抽象类
|
1月前
|
测试技术 C++
C++|运算符重载(3)|日期类的计算
C++|运算符重载(3)|日期类的计算
|
1天前
|
编译器 C++
C++练级之路——类和对象(中二)
C++练级之路——类和对象(中二)
11 5
|
1天前
|
存储 编译器 C++
C++练级之路——类和对象(上)
C++练级之路——类和对象(上)
10 3
|
1天前
|
存储 Java C#
C++语言模板类对原生指针的封装与模拟
C++|智能指针的智能性和指针性:模板类对原生指针的封装与模拟