【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

相关文章
|
4月前
|
C++
C++ 根据程序运行的时间和cpu频率来计算在另外的cpu上运行所花的时间
C++ 根据程序运行的时间和cpu频率来计算在另外的cpu上运行所花的时间
53 0
|
4月前
|
C++
C++ PCL 计算多个RT矩阵变换后的变换矩阵
C++ PCL 计算多个RT矩阵变换后的变换矩阵
58 0
|
4月前
|
C++
C++代码来计算一个点围绕另一个点旋转45度后的坐标
C++代码来计算一个点围绕另一个点旋转45度后的坐标
104 0
|
5月前
|
机器学习/深度学习 算法 C++
C++多态崩溃问题之为什么在计算梯度下降时需要除以批次大小(batch size)
C++多态崩溃问题之为什么在计算梯度下降时需要除以批次大小(batch size)
|
29天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
50 2
|
1月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
103 5
|
1月前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
91 4
|
1月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
108 4
|
2月前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
32 4
|
2月前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
32 4