【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

相关文章
|
C++
C++ 根据程序运行的时间和cpu频率来计算在另外的cpu上运行所花的时间
C++ 根据程序运行的时间和cpu频率来计算在另外的cpu上运行所花的时间
129 0
|
6月前
|
存储 编译器 C++
【c++】多态(多态的概念及实现、虚函数重写、纯虚函数和抽象类、虚函数表、多态的实现过程)
本文介绍了面向对象编程中的多态特性,涵盖其概念、实现条件及原理。多态指“一个接口,多种实现”,通过基类指针或引用来调用不同派生类的重写虚函数,实现运行时多态。文中详细解释了虚函数、虚函数表(vtable)、纯虚函数与抽象类的概念,并通过代码示例展示了多态的具体应用。此外,还讨论了动态绑定和静态绑定的区别,帮助读者深入理解多态机制。最后总结了多态在编程中的重要性和应用场景。 文章结构清晰,从基础到深入,适合初学者和有一定基础的开发者学习。如果你觉得内容有帮助,请点赞支持。 ❤❤❤
851 0
|
8月前
|
Serverless 编译器 C++
【C++面向对象——类的多态性与虚函数】计算图像面积(头歌实践教学平台习题)【合集】
本任务要求设计一个矩形类、圆形类和图形基类,计算并输出相应图形面积。相关知识点包括纯虚函数和抽象类的使用。 **目录:** - 任务描述 - 相关知识 - 纯虚函数 - 特点 - 使用场景 - 作用 - 注意事项 - 相关概念对比 - 抽象类的使用 - 定义与概念 - 使用场景 - 编程要求 - 测试说明 - 通关代码 - 测试结果 **任务概述:** 1. **图形基类(Shape)**:包含纯虚函数 `void PrintArea()`。 2. **矩形类(Rectangle)**:继承 Shape 类,重写 `Print
132 4
|
11月前
|
算法 C++
【算法单调栈】 矩形牛棚(C/C++)
【算法单调栈】 矩形牛棚(C/C++)
|
C++
C++ PCL 计算多个RT矩阵变换后的变换矩阵
C++ PCL 计算多个RT矩阵变换后的变换矩阵
155 0
|
C++
C++代码来计算一个点围绕另一个点旋转45度后的坐标
C++代码来计算一个点围绕另一个点旋转45度后的坐标
261 0
|
7月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
3月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
91 0
|
3月前
|
存储 编译器 程序员
c++的类(附含explicit关键字,友元,内部类)
本文介绍了C++中类的核心概念与用法,涵盖封装、继承、多态三大特性。重点讲解了类的定义(`class`与`struct`)、访问限定符(`private`、`public`、`protected`)、类的作用域及成员函数的声明与定义分离。同时深入探讨了类的大小计算、`this`指针、默认成员函数(构造函数、析构函数、拷贝构造、赋值重载)以及运算符重载等内容。 文章还详细分析了`explicit`关键字的作用、静态成员(变量与函数)、友元(友元函数与友元类)的概念及其使用场景,并简要介绍了内部类的特性。
169 0
|
5月前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
177 12