1.目的:

/*设计一个计算图形面积的类库。
类库的顶层是一个抽象类,并且提供三个纯虚函数;显示数据成员、返回面积和返回体积。
Class Shape
{
virtual void showData()=0;
virtual double reArea()=0;
virtual double reVolume()=0;
};
第二层由Shape类派生TwoDimShape(二维图形)和ThreeShape(三维图形),
它们增加了有关的数据成员,但没有成员函数的实现。
第三层派生具体的图形类。TwoDimShape类派生Circle(圆)、Elipse(椭圆)、
Rectangle(矩形)和Triangle(三角形)等类。
ThreeShape类派生Ball(球体)、Cylinder(圆柱体)、
RectangularParallelepiped(长方体)等类。
在主函数测试中使用多态方式调用不同对象的求值函数。
*/

2.代码如下:

/*
*This file contains code for C++ 6th experiment
*By LZH
*/
#include<iostream>
#include<string>
using namespace std;
const double PI = acos(-1.0);
// Definition of Shape class and related functions goes here
class Shape
{
virtual void showData() = 0;
virtual double reArea() = 0;
virtual double reVolume() = 0;
};
class TwoDimShape :virtual public Shape {
protected:
double x, y;
public:
virtual void showData() {
return ;
}
virtual double reArea() {
return 0;
}
virtual double reVolume() {
return 0;
}
};
class ThreeShape :virtual public Shape {
protected:
double x, y, z;
public:
virtual void showData() {
return;
}
virtual double reArea() {
return 0;
}
virtual double reVolume() {
return 0;
}
};
class Circle :virtual public TwoDimShape {
public:
Circle(double tp) {
x = tp;
}
Circle(Circle &asp) {
x = asp.x;
}
~Circle()
{ }
void showData() {
cout << "This is a Circle:" << endl
<< "The radiation:" << x << endl
<< "The area:" << reArea() << endl;
}
double reArea() {
return PI*x*x;
}
};
class Elipse :virtual public TwoDimShape {
public:
Elipse(double ta, double tb) {
x = ta, y = tb;
}
Elipse(Elipse &asp) {
x = asp.x, y = asp.y;
}
~Elipse() { }
void showData() {
cout << "This is a Elipse:" << endl
<< "The long axis:" << x << endl
<< "The short axis:" << y << endl
<< "The area:" << reArea() << endl;
}
double reArea() {
return PI*x*y;
}
};
class Rectangle :virtual public TwoDimShape {
public:
Rectangle(double ta, double tb) {
x = ta, y = tb;
}
Rectangle(Rectangle &asp) {
x = asp.x, y = asp.y;
}
~Rectangle() { }
void showData() {
cout << "This is a Rectangle:" << endl
<< "The long axis:" << x << endl
<< "The short axis:" << y << endl
<< "The area:" << reArea() << endl;
}
double reArea() {
return x*y;
}
};
class Triangle :virtual public TwoDimShape {
public:
Triangle(double ta, double tb) {
x = ta, y = tb;
}
Triangle(Triangle &asp) {
x = asp.x, y = asp.y;
}
~Triangle() { }
void showData() {
cout << "This is a Triangle:" << endl
<< "The base length:" << x << endl
<< "The height :" << y << endl
<< "The area:" << reArea() << endl;
}
double reArea() {
return x*y / 2.0;
}
};
class Ball :virtual public ThreeShape {
public:
Ball(double ta) {
x = ta;
}
Ball(Ball &asp) {
x = asp.x;
}
~Ball() { }
void showData() {
cout << "This is a Ball:" << endl
<< "The radiation:" << x << endl
<< "The surface area:" << reArea() << endl;
}
double reArea() {
return PI*pow(x, 3)*4.0 / 3.0;
}
double reVolume() {
return PI*x*x;
}
};
class Cylinder :virtual public ThreeShape {
public:
/*
V=PI*r*r*h S=2*PI*r+r*h
*/
Cylinder(double ta, double tb) {
x = ta, y = tb;
}
Cylinder(Cylinder &asp) {
x = asp.x, y = asp.y;
}
~Cylinder() { }
void showData() {
cout << "This is a Cylinder:" << endl
<< "The radiation:" << x << endl
<< "The height:" << y << endl
<< "The surface area:" << reArea() << endl;
}
double reArea() {
return 2 * PI*x + x*y;
}
double reVolume() {
return PI*x*x*y;
}
};
//RectangularParallelepiped
class cuboid :virtual public ThreeShape {
public:
cuboid(double ta, double tb, double tc) {
x = ta, y = tb, z = tc;
}
cuboid(cuboid &asp) {
x = asp.x, y = asp.y, z = asp.z;
}
void showData() {
cout << "This is a cuboid:" << endl
<< "The length:" << x << endl
<< "The width:" << y << endl
<< "The height" << z << endl
<< "The surface area:" << reArea() << endl; }
double reArea() {
return 2 * (x*y + x*z + y*z);
}
double reVolume() {
return x*y*z;
}
};
int main(void) {
TwoDimShape a;
ThreeShape b;
TwoDimShape *p = &a;
ThreeShape *w = &b;
Circle t1(1.0);
Elipse t2(1.0, 2.0);
Rectangle t3(10.0,2.3);
Triangle t4(4.0, 5.0);
Ball t5(2.33333);
Cylinder t6(4.5, 65.0);
cuboid t7(132, 5,156);
p = &t1;
p->showData();
p = &t2;
p->showData();
p = &t3;
p->showData();
p = &t4;
p->showData();
w = &t5;
w->showData();
w = &t6;
w->showData();
w = &t7;
w->showData();
return 0;
}

3 . 测试截图



4.关于多态性

 在这个例子中我用了基类指针指向基类,这个不难理解,在类型兼容规则下,
指向基类的指针可以隐式的转换成派生类的指针。
这是最常见的关于多态的用法,利用该指针指向任意一个子类对象,
就可以调用相应的虚函数,指向的子类的不同,实现的方法也就不同。

C++继承与多态练习--计算图形面积的更多相关文章

  1. C#基础总结之八面向对象知识点总结-继承与多态-接口

    .方法深入讲解(返回值,形参与实参) 方法 public int getName(int i,int j) { int sum = i + j; return sum; } .利用泛型存储对象数据 . ...

  2. C++封装、继承、多态

    C++封装继承多态总结 面向对象的三个基本特征 面向对象的三个基本特征是:封装.继承.多态.其中,封装可以隐藏实现细节,使得代码模块化:继承可以扩展已存在的代码模块(类):它们的目的都是为了--代码重 ...

  3. JavaScript 定义类的最佳写法——完整支持面向对象(封装、继承、多态),兼容所有浏览器,支持用JSDuck生成文档

    作者: zyl910 [TOC] 一.缘由 由于在ES6之前,JavaScript中没有定义类(class)语法.导致大家用各种五花八门的办法来定义类,代码风格不统一.而且对于模拟面向对象的三大支柱& ...

  4. 《JAVA程序设计与实例》记录与归纳--继承与多态

    继承与多态 概念贴士: 1. 继承,即是在已经存在的类的基础上再进行扩展,从而产生新的类.已经存在的类成为父类.超类和基类,而新产生的类成为子类或派生类. 2. Java继承是使用已存在的类的定义作为 ...

  5. Java进阶篇(一)——接口、继承与多态

    前几篇是Java的入门篇,主要是了解一下Java语言的相关知识,从本篇开始是Java的进阶篇,这部分内容可以帮助大家用Java开发一些小型应用程序,或者一些小游戏等等. 本篇的主题是接口.继承与多态, ...

  6. c# 中的封装、继承、多态详解

    面向对象有封装.继承.多态这三个特性,面向对象编程按照现实世界的特点来管理复杂的事物,把它们抽象为对象,具有自己的状态和行为,通过对消息的反应来完成任务.这种编程方法提供了非常强大的多样性,大大增加了 ...

  7. Day7 初识面向对象,面向对象之继承、多态和封装

    一.面向对象引言 一.面向对象的程序设计的由来 详述见:http://www.cnblogs.com/linhaifeng/articles/6428835.html 二.面向对象引子 写一个简单程序 ...

  8. Java编程的逻辑 (15) - 初识继承和多态

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  9. Java 继承和多态

                                                        Java  继承和多态 Java 继承 继承的概念 继承是java面向对象编程技术的一块基石,因 ...

随机推荐

  1. Linux 下MySQL的基本操作

    1.连接MySQL 连接到本机的MySQL 键入命令mysql -u root -p 回车提示你输入密码. Ps:用户名前可以有空格也可以没有空格,但是密码前必须没有空格 MySQL的提示符是: my ...

  2. Tinker + Bugly + Jenkins 爬坑之路

    前阵子 Android 端的线上崩溃比较多,热修复被提上日程.实现方案是 Tinker,Jenkins 打包,最后补丁包上传到 Bugly 进行分发.主要在 Jenkins 打包这一块爬了不少坑,现记 ...

  3. vue知识点之day5

    vuex是解决多层父子关系传值的问题,减少了传值的复杂度 vue+webpack安装图示

  4. react入门参考资料

    ReactJS简介 React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写一套,用来架设 Instagram 的网站.做出 ...

  5. 浅谈count(*)、count(1)、count(列名)

    count(*) 和 count(1)和count(列名)区别  执行效果上:  count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL  count(1)包括了所有列, ...

  6. win10系统80端口被System (PID=4)占用的解决

    今天想用wamp搭建虚拟目录.发现80端口被占用,操作挺麻烦的,所以想要更改. 具体流程如下: 1.“win+R”输入“cmd”,然后输入“netstat -ano | findstr "8 ...

  7. mysql免安装版配置+navicat测试

    好久之前就在mysql官网下载了mysql的包,但是一直没有安装.今天测试下. 下载好的mysql是一个zip压缩包,直接解压就可以了,然后改名为mysql,以免路径太复杂. 配置环境变量 把D:\A ...

  8. [翻译] KYCircularProgress

    KYCircularProgress Flexible progress bar written in Swift. 用Swift语言编写的灵活的进度条控件. Features Gradation C ...

  9. HAProxy负载均衡保持客户端和服务器Session亲缘性的3种方式

    1 用户IP 识别  haroxy 将用户IP经过hash计算后 指定到固定的真实服务器上(类似于nginx 的IP hash 指令) 配置指令: balance source 配置实例: backe ...

  10. Excel开发之旅(三)——添加侧边工具栏

    1. 添加自定义用户控件:选择项目添加新建项用户控件.修改文件名,点击添加即可. 2. 重复步骤1,再添加3个自定义控件,接下来我们在自定义用户控件上面添加一些工具箱组件 3. 由于我们添加的是侧边工 ...