C++ 实验七 多态性与虚函数
问题背景:
将任意一个平面图形(如长方形、三角形、圆形等)沿其法线方向平移一定长度,它所扫过的空间区域为一个柱体。例如,长方形、圆形和三角形所形成的柱体分别如图(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:
存在的问题:
- 注意cmath头文件
可行性优化:
- 使用构造函数对类对象进行初始化,同时注意纯虚函数的构造函数使用时的问题
欢迎访问陈风的个人博客
C++ 实验七 多态性与虚函数相关推荐
- 实验6 多态性和虚函数(一)
定义一个Animal,该类中可以存放动物的名字,并有一个Identity函数用于显示动物的种类.定义两个类Cat和Dog,都继承自Animal,并重载Identity函数,不但要显示动物的种类,还要显 ...
- C++(23)--多态性与虚函数
多态性与虚函数 1.静态多态-重载 2.动态多态-重写 2.1 向上转换/向下转换 3.虚函数的工作原理 4.纯虚函数和抽象类 5.补充项目(都市浮生记)-卒 <老九学堂C++课程>学习笔 ...
- C++ 的多态性与虚函数
腾讯二面时被问到关于C++的多态性和虚函数,当时脑袋发热没回答好,其实根本原因是这是很久之前看的,而且一直没有应用上,所以理所当然说不出个所以然来.趁着国庆假期,把C++草草捡了些回来,现在主要说下多 ...
- C++面试题-面向对象-多态性与虚函数
C++面试题-面向对象-多态性与虚函数 问:在C++程序中调用被C编译器编译后的函数,为什么要加extern "C"? 答:C++语言支持函数重载,C语言不支持函数重载.函数被C+ ...
- 头歌C++面向对象 - 类的多态性与虚函数
C++ 面向对象 - 类的多态性与虚函数 一.实训目的 1.掌握虚函数的基本使用. 2.掌握虚析构函数的使用. 3.掌握纯虚函数和抽象类的使用. 二.实训内容 1.人与复读机 设计人类.英语学生类和复 ...
- C++ 多态性和虚函数
多态性是指当类之间存在层次结构,并且类之间是通过继承关联时,此时调用成员函数,会根据调用函数的对象的类型来执行不同的函数. 多态性可分为静态多态性和动态多态性: 静态多态性,通过函数重载实现,在编译时 ...
- C++之多态性与虚函数
面向对象程序设计中的多态性是指向不同的对象发送同一个消息,不同对象对应同一消息产生不同行为.在程序中消息就是调用函数,不同的行为就是指不同的实现方法,即执行不同的函数体.也可以这样说就是实现了&quo ...
- 函数的多态性以及虚函数
包含一个及一个以上的纯虚函数的类就是抽象基类,抽象基类没有也不能必要定义对象. **#include <iostream> using namespace std; class Shape ...
- c 结构体在声明时赋值_C/C++编程笔记:C++入门知识,C++多态性和虚函数解析
本篇要学习的内容和知识结构概览 多态性 编译时的多态性称为静态联编. 当调用重载函数时, 在编译期就确定下来调用哪个函数. 运行时的多态性称为动态联编. 在运行时才能确定调用哪个函数, 由虚函数来支持 ...
最新文章
- 『TensorFlow』命令行参数解析
- 算法:删除数组中的重复项
- 算法(7)-leetcode-explore-learn-数据结构-数组-小结
- LeetCode 1822. 数组元素积的符号
- jeesite如何已生成数据的数据源_如何在postman中自动生成接口请求数据,这个功能你需要知道,可结合浏览器和两大抓包工具使用...
- H3C服务器系统配置ip,H3C交换机DHCP 服务器动态分配地址典型配置指导
- 最近在我的python博客上花时间!
- SpringCloud工作笔记103---Mybatis-plus使用注解 @TableField(exist = false) 注明非数据库字段属性
- Spring Security中关于认证授权的配置
- 0. Python3源码—编译
- novatel中DGPS和RTK以及ppp的terrraStar-x的记录
- Python 断言的使用
- JAVA线程中的sleep()、wait()、yield()、join()作用
- shell可以卖钱_【一点资讯】什么叫Shell Cordovan呢?马臀皮鞋子,牛仔裤和腰带能卖多少钱...
- Word/Excel文档操作API哪家强?一张表带你了解Aspose和Spire系列全功能对比
- 2022年登高架设试题及解析及登高架设模拟试题
- eplan增加其他到工具栏_EPLAN脚本从入门到应用-2 工具栏
- 【HPE】3D HPE调研
- 在linux下QT设计实现视频播放器
- 【Unity3D入门教程】Unity3D界面介绍及游戏对象基本操作
热门文章
- 有关网络通信的基本概念
- 微信小程序获取客户端IP地址,HTTPS接口(ts\js)
- html360搜索框代码,HTML 代码标签
- Java 老矣,尚能饭否?
- csdn里面代码块颜色
- Hdu 2389 Rain on your Parade
- “麦田音乐节·超时空歌会”即将破空 探索元宇宙虚拟演唱会新形式
- 仿微博、微信、qq 点击缩略图, 查看高清图 UI 组件
- 计算机编程课程顺序_您可以在八月开始的500项免费在线编程和计算机科学课程
- java script中extends,JavaScript继承之ES6的extends