问题背景:
将任意一个平面图形(如长方形、三角形、圆形等)沿其法线方向平移一定长度,它所扫过的空间区域为一个柱体。例如,长方形、圆形和三角形所形成的柱体分别如图(a)(b)©所示。
实验题:
柱体的体积 和表面积 计算公式分别为:

式中, 和 分别为柱体的底面积和底面周长。
请用C++语言编写面向对象程序,实现柱体体积和表面积的计算(圆柱和四棱柱为必做内容,三棱柱为选做内容)。例如底面半径为2、高为4的圆柱,体积为50.27,表面积为75.40;以长为3、宽为2的长方形为底面,高为5的四棱柱,体积为30,表面积为62。
提示:
注意:以下定义的类中,若未给出构造函数、析构函数及输出函数,请根据需要添加。
1、 定义一个描述平面图形的抽象类Plane,其成员函数如下表:

函数名 访问权限 形参 返回值 功能 虚函数?
area public void float 求面积 纯虚函数
girth public void float 求周长 纯虚函数

2、定义一个描述柱体的类Body:

(1) 类Body的成员变量如下表:

变量名 访问权限 类型 含义
pbasic private Plane * 指向柱体的底面图形
high private float 给出柱体的高

(2) 类Body的成员函数如下表:

函数名 访问权限 形参 返回值 功能 虚函数?
volume public void float 求体积 否
surfaceArea public void float 求表面积 否
3、从抽象类Plane派生出具体类(如长方形类Rectangle、圆形类Circle和三角形类triangle),根据实际情况,覆盖基类Plane的纯虚函数area和girth,如下表。

函数名 访问权限 形参 返回值 功能 虚函数?
area public void float 求面积 自动为虚函数
girth public void float 求周长 自动为虚函数

(1) 长方形类Rectangle的成员变量为

变量名 访问权限 类型 含义
a private float 给出长方形的长
b private float 给出长方形的宽

(2) 圆形类Circle的成员变量为

变量名 访问权限 类型 含义
a private float 给圆形的半径

(3) 三角形类Triangle的成员变量为

变量名 访问权限 类型 含义
A private Point 给出三角形的顶点A
B private Point 给出三角形的顶点B
C private Point 给出三角形的顶点C

其中,Point为描述平面点的类,其成员变量为:

变量名 访问权限 类型 含义
x public float 给出顶点的x坐标
y public float 给出顶点的y坐标

附代码
!!!编译环境 DevC++ 5.11 TDM-GCC 4.9.2 64-Bit Release
头文件 iquery.h

#ifndef  _IQUERY_H
#define _IQUERY_H 1using namespace std;class Plane{public:virtual float area() const =0;virtual float girth() const =0;}class Body{public:float volume();float surfaceArea();void setpb(Plane *p);void sethigh();private:Plane *pbasic;float high;};class Point{public:void setpoint();float x;float y;};class Rectangle: public Plane{public:void setrec();virtual float area()const;virtual float girth()const;private:float a;float b;};class Circle: public Plane{public:void setcir();virtual float area()const;virtual float girth()const;private:float a;};class Triangle: public Plane{public:void settri();virtual float area()const;virtual float girth()const;private:Point A;Point B;Point C;};
#endif

头文件实现文件 iquery,cpp

#include <iostream>
#include "string"
#include "iquery.h"
#include "iomanip"
#include "cmath"
using namespace std;
float Body::volume(){return pbasic->area()*high;
}
float Body::surfaceArea(){return 2*pbasic->area()+pbasic->girth()*high;
}
void Body::setpb(Plane *p){pbasic=p;
}
void Body::sethigh(){cin >>high;
}
void Rectangle :: setrec(){cout << "输入四棱柱底面的长:" ;cin >>a; cout<<endl;cout << "输入四棱柱底面的宽:" ;cin >> b; cout <<endl;
}
float Rectangle :: area()const{return a*b;
}
float Rectangle ::girth()const{return 2*(a+b);
}
void Circle :: setcir(){cout <<"输入圆柱的半径:" ;cin >> a;cout<<endl;
}
float Circle :: area()const{return 3.14159*a*a;
}
float Circle :: girth()const{return 2*3.14159*a;
}
void Point ::setpoint(){cin >> x >>y;
}
void Triangle :: settri(){cout << "输入三棱柱底面顶点A的<x y>坐标:" ;A.setpoint();cout<<endl;cout << "输入三棱柱底面顶点B的<x y>坐标:" ;B.setpoint();cout<<endl;cout << "输入三棱柱底面顶点C的<x y>坐标:" ;C.setpoint();cout<<endl;
}
float Triangle :: area()const{float m;m=A.x*B.y+A.y*C.x+B.x*C.y-A.x*C.y-A.y*B.x-B.y*C.x;if(m>0) return m/2;else return -m/2;
}
float Triangle :: girth()const{return sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y))+sqrt((C.x-B.x)*(C.x-B.x)+(C.y-B.y)*(C.y-B.y))+sqrt((A.x-C.x)*(A.x-C.x)+(A.y-C.y)*(A.y-C.y));
}

源码 main.cpp

#include <iostream>
#include "string"
#include "iquery.h"
#include "iomanip"
#include "cmath" /* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
int main(int argc, char** argv) {Body body;Circle c;Rectangle r;Triangle t;body.setpb(&c);c.setcir();cout << "输入圆柱体的高:";body.sethigh();cout<<"圆柱体的体积为:"<<body.volume()<<endl;cout<<"圆柱体的表面积为:"<<body.surfaceArea()<<endl;cout<<endl;body.setpb(&r);r.setrec();cout <<"输入四棱柱的高:";body.sethigh();cout<<"四棱柱的体积为:"<<body.volume()<<endl;cout<<"四棱柱的表面积为:"<<body.surfaceArea()<<endl;cout<<endl;body.setpb(&t);t.settri();cout << "输入三棱柱的高:";body.sethigh();cout<<"三棱柱的体积为:"<<body.volume()<<endl;cout<<"三棱柱的表面积为:"<<body.surfaceArea()<<endl; return 0;
}

注:
已经出现过的error:

存在的问题:

  1. 注意cmath头文件

可行性优化:

  1. 使用构造函数对类对象进行初始化,同时注意纯虚函数的构造函数使用时的问题

欢迎访问陈风的个人博客

C++ 实验七 多态性与虚函数相关推荐

  1. 实验6 多态性和虚函数(一)

    定义一个Animal,该类中可以存放动物的名字,并有一个Identity函数用于显示动物的种类.定义两个类Cat和Dog,都继承自Animal,并重载Identity函数,不但要显示动物的种类,还要显 ...

  2. C++(23)--多态性与虚函数

    多态性与虚函数 1.静态多态-重载 2.动态多态-重写 2.1 向上转换/向下转换 3.虚函数的工作原理 4.纯虚函数和抽象类 5.补充项目(都市浮生记)-卒 <老九学堂C++课程>学习笔 ...

  3. C++ 的多态性与虚函数

    腾讯二面时被问到关于C++的多态性和虚函数,当时脑袋发热没回答好,其实根本原因是这是很久之前看的,而且一直没有应用上,所以理所当然说不出个所以然来.趁着国庆假期,把C++草草捡了些回来,现在主要说下多 ...

  4. C++面试题-面向对象-多态性与虚函数

    C++面试题-面向对象-多态性与虚函数 问:在C++程序中调用被C编译器编译后的函数,为什么要加extern "C"? 答:C++语言支持函数重载,C语言不支持函数重载.函数被C+ ...

  5. 头歌C++面向对象 - 类的多态性与虚函数

    C++ 面向对象 - 类的多态性与虚函数 一.实训目的 1.掌握虚函数的基本使用. 2.掌握虚析构函数的使用. 3.掌握纯虚函数和抽象类的使用. 二.实训内容 1.人与复读机 设计人类.英语学生类和复 ...

  6. C++ 多态性和虚函数

    多态性是指当类之间存在层次结构,并且类之间是通过继承关联时,此时调用成员函数,会根据调用函数的对象的类型来执行不同的函数. 多态性可分为静态多态性和动态多态性: 静态多态性,通过函数重载实现,在编译时 ...

  7. C++之多态性与虚函数

    面向对象程序设计中的多态性是指向不同的对象发送同一个消息,不同对象对应同一消息产生不同行为.在程序中消息就是调用函数,不同的行为就是指不同的实现方法,即执行不同的函数体.也可以这样说就是实现了&quo ...

  8. 函数的多态性以及虚函数

    包含一个及一个以上的纯虚函数的类就是抽象基类,抽象基类没有也不能必要定义对象. **#include <iostream> using namespace std; class Shape ...

  9. c 结构体在声明时赋值_C/C++编程笔记:C++入门知识,C++多态性和虚函数解析

    本篇要学习的内容和知识结构概览 多态性 编译时的多态性称为静态联编. 当调用重载函数时, 在编译期就确定下来调用哪个函数. 运行时的多态性称为动态联编. 在运行时才能确定调用哪个函数, 由虚函数来支持 ...

最新文章

  1. 『TensorFlow』命令行参数解析
  2. 算法:删除数组中的重复项
  3. 算法(7)-leetcode-explore-learn-数据结构-数组-小结
  4. LeetCode 1822. 数组元素积的符号
  5. jeesite如何已生成数据的数据源_如何在postman中自动生成接口请求数据,这个功能你需要知道,可结合浏览器和两大抓包工具使用...
  6. H3C服务器系统配置ip,H3C交换机DHCP 服务器动态分配地址典型配置指导
  7. 最近在我的python博客上花时间!
  8. SpringCloud工作笔记103---Mybatis-plus使用注解 @TableField(exist = false) 注明非数据库字段属性
  9. Spring Security中关于认证授权的配置
  10. 0. Python3源码—编译
  11. novatel中DGPS和RTK以及ppp的terrraStar-x的记录
  12. Python 断言的使用
  13. JAVA线程中的sleep()、wait()、yield()、join()作用
  14. shell可以卖钱_【一点资讯】什么叫Shell Cordovan呢?马臀皮鞋子,牛仔裤和腰带能卖多少钱...
  15. Word/Excel文档操作API哪家强?一张表带你了解Aspose和Spire系列全功能对比
  16. 2022年登高架设试题及解析及登高架设模拟试题
  17. eplan增加其他到工具栏_EPLAN脚本从入门到应用-2 工具栏
  18. 【HPE】3D HPE调研
  19. 在linux下QT设计实现视频播放器
  20. 【Unity3D入门教程】Unity3D界面介绍及游戏对象基本操作

热门文章

  1. 有关网络通信的基本概念
  2. 微信小程序获取客户端IP地址,HTTPS接口(ts\js)
  3. html360搜索框代码,HTML 代码标签
  4. Java 老矣,尚能饭否?
  5. csdn里面代码块颜色
  6. Hdu 2389 Rain on your Parade
  7. “麦田音乐节·超时空歌会”即将破空 探索元宇宙虚拟演唱会新形式
  8. 仿微博、微信、qq 点击缩略图, 查看高清图 UI 组件
  9. 计算机编程课程顺序_您可以在八月开始的500项免费在线编程和计算机科学课程
  10. java script中extends,JavaScript继承之ES6的extends