面向对象

合集下载

面向对象的7条基本原则包括

面向对象的7条基本原则包括

面向对象的7条基本原则包括
1. 单一职责原则 (Single Responsibility Principle, SRP):一个类只负责单一的功能或任务。

2. 开放封闭原则 (Open-Closed Principle, OCP):软件实体应该对扩展开放,对修改关闭。

3. 里氏替换原则 (Liskov Substitution Principle, LSP):子类应该能够替换其父类,而不影响程序的正确性。

4. 接口隔离原则 (Interface Segregation Principle, ISP):不要强迫客户端依赖它们不需要使用的接口,将接口分割成更小更具体的部分。

5. 依赖倒置原则 (Dependency Inversion Principle, DIP):高层模块不应该依赖于低层模块,而应该依赖于抽象接口。

6. 迪米特法则 (Law of Demeter, LoD):一个对象应该对其他对象尽可能少的了解,只与最直接的朋友通信。

7. 合成复用原则 (Composition/Aggregation Reuse Principle, CARP):优先使用组合/聚合而不是继承来实现代码重用。

什么是面向对象、对象是什么、什么是类、如何使用对象、类和对象的关系

什么是面向对象、对象是什么、什么是类、如何使用对象、类和对象的关系

什么是⾯向对象、对象是什么、什么是类、如何使⽤对象、类和对象的关系⾯向对象⼀、⾯向对象 概念:⾯向对象是⼀种编程思想,使⽤编程语⾔解决现实问题的⼀种思路。

分类: ⾯向过程: C 语⾔ ⾯向对象: Java ⾯向对象的思想: ⾯向对象的思想: ⾯向过程的思想:⾃顶向下 逐步执⾏。

---> 当解决⼀件事情的时候,⾸先想到的是我该怎么去做⾯向对象思想:以对象为中⼼,使⽤对象调⽤其功能。

---> 当解决⼀件事情的时候,⾸先想到的是我该让谁帮我做。

想到的谁 ---> 对象 对象:现实⽣活中存在的真实的事物都是对象,Java 中有⼀句名⾔: 万物皆对象,⼤到宇宙、⼩到夸克在Java 的世界中都可以看成对象。

提起对象,就需要提起另⼀个概念——类。

类是对象的模板,对象是类的实例。

⼆、类 概念: 将具有相同特征的⼀类事物的共性进⾏抽取(抽取的过程叫做抽象),形成的⼀个概念叫做类。

类的抽象: 1. 怎么去描述⼀个事物,从哪些维度进⾏描述? 这个事物具有什么 ---> 属性 这个事物会做什么 ---> ⾏为 2. 怎么去描述⼀类事物的共性? 这些事物具有什么 ---> 属性 这些事物会做什么 ---> ⾏为 类和对象的关系: 类是对象的模板 对象是类的实例 类的定义: 概述: 属性 : 使⽤成员变量来进⾏描述 ⾏为 : 使⽤成员⽅法进⾏描述 语法:关键词:class语法:public class 类名{} 成员变量 定义位置:类中⽅法外 语法: 数据类型 变量名; / 数据类型 变量名 = 初始值;作⽤域:⾄少在本类 默认值: 和数组元素的默认值是⼀样的 基本数据类型 整数类型 0 ⼩数类型 0.0 字符类型空字符 布尔类型 false 引⽤数据类型 null 定义的注意事项 1. 在同⼀个类中不能定义两个同名的成员变量 2. 在同⼀个类中成员变量可以和局部变量可以重名,但是在访问的时候,局部变量优先。

面向对象面试题

面向对象面试题

面向对象面试题1、什么是面向对象面向对象OO = 面向对象的分析OOA + 面向对象的设计OOD + 面向对象的编程OOP;通俗的解释就是万物皆对象,把所有的事物都看作一个个可以独立的对象(单元),它们可以自己完成自己的功能,而不是像C那样分成一个个函数;现在纯正的OO语言主要是java和C#,C++也支持OO,C是面向过程的。

2、简述private、protected、public、internal 修饰符的访问权限。

private : 私有成员, 在类的内部才可以访问。

protected : 保护成员,该类内部和继承类中可以访问。

public : 公共成员,完全公开,没有访问限制。

internal: 当前程序集内可以访问。

3、中的五个主要对象Connection:主要是开启程序和数据库之间的连结。

没有利用连结对象将数据库打开,是无法从数据库中取得数据的。

这个物件在 的最底层,我们可以自己产生这个对象,或是由其它的对象自动产生。

Command:主要可以用来对数据库发出一些指令,例如可以对数据库下达查询、新增、修改、删除数据等指令,以及呼叫存在数据库中的预存程序等。

这个对象是架构在Connection 对象上,也就是Command 对象是透过连结到数据源。

DataAdapter:主要是在数据源以及DataSet 之间执行数据传输的工作,它可以透过Comm and 对象下达命令后,并将取得的数据放入DataSet 对象中。

这个对象是架构在Command 对象上,并提供了许多配合DataSet 使用的功能。

DataSet:这个对象可以视为一个暂存区(Cache),可以把从数据库中所查询到的数据保留起来,甚至可以将整个数据库显示出来。

DataSet 的能力不只是可以储存多个Table 而已,还可以透过DataAdapter对象取得一些例如主键等的数据表结构,并可以记录数据表间的关联。

DataSet 对象可以说是 中重量级的对象,这个对象架构在DataAdapter对象上,本身不具备和数据源沟通的能力;也就是说我们是将DataAdapter对象当做DataSet 对象以及数据源间传输数据的桥梁。

面向对象的概念

面向对象的概念

1.面向对象的概念面向对象(Object-Oriented)=对象(Object)+类(Class)+ 继承(Inheritance)+通信(Communication)如果一个软件系统是使用这样4个概念设计和实现的,则将该软件系统称为面向对象的。

下面给出每个概念的具体定义。

1.1 对象从一般意义上讲,对象是现实世界中一个实际存在事物,它可以是有形的(比如一辆汽车),也可以是无形(比如一项计划)。

对象构成世界的一个独立单位,它具有自己的静态特征和动态特征。

静态特征即可用某种数据来描述的特征,动态特征即对象所表现的行为或对象所具有的功能。

现实世界中的任何事物都可以称作对象,它是大量的、无处不在的。

不过,人们在开发一个系统时,通常只是在一定的范围(问题域)内考虑和认识与系统目标有关的事物,并用系统中的对象抽象地表示它们。

所以面向对象方法在提到“对象”这个术语时,既可能泛指现实世界中的某些事物,也可能专指它们在系统中的抽象表示,即系统中的对象。

我们主要对后一种情况讨论对象的概念,其定义是:对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。

一个对象由一组属性和对这组属性进行操作的一组服务构成。

属性和服务,是构成对象的两个主要因素,其定义是:属性是用来描述对象静态特征的一个数据项。

服务是用来描述对象动态特征(行为)的一个操作序列。

一个对象可以有多项属性和多项服务。

一个对象的属性和服务被结合成一个整体,对象的属性值只能由这个对象的服务存取。

在有些文献中把对象标识(OID)列为对象的另一要素。

对象标识也就是对象的名字,有“外部标识”和“内部标识”之分。

前者供对象的定义者或使用者用,后者为系统内部惟一的识别对象。

(怎么感觉这点跟android开发里面的id是一样的,在某个文件下有编程人员定义的所有属性的id,并且是唯一的,一般不允许更改,属于系统内部分配。

) 另外需要说明以下两点:第一点是,对象只描述客观事物本质的与系统目标有关的特征,而不考虑那些非本质的与系统目标无关的特征。

面向对象个人心得体会

面向对象个人心得体会

面向对象个人心得体会篇一:面向对象的编程总结一、什么是面向对象:所谓面向对象的编程就是:通过封装,继承,多态,把程序的耦合度降低,传统的雕版印刷术的问题就在于所有刻字都在同一版面上造成耦合度太高所致,当用面向对象的模式,使得印刷程序更加灵活,容易修改,并且易于复用。

对象(Object)是类(Class)的一个实例(Instance)。

如果将对象比作房子,那么类就是房子的设计图纸。

所以面向对象程序设计的重点是类的设计,而不是对象的设计。

类可以将数据和函数封装在一起,其中函数表示了类的行为(或称服务)。

类提供关键字public、protected 和private 用于声明哪些数据和函数是公有的、受保护的或者是私有的。

二:基类类与结构体的区别和联系; Strcut test{Private:Int number; Public:Float socre; };类的创建方式和结构体几乎一样, Class test {Private:Int number; Public:Float socre;Public:Public:Int rp();{ Return number;}Void setnum(int a) {Number=a; }}; 但是大家注意到没有,标准c中不允许在结构体中声明函数的,但是在c++中的类中是可以的,这就和c有了本质的区别,很好体现了c++面向对象的特点。

两种语言的区别:过去的c语言是一种面向过程的语言特性是:程序=算法+数据结构但c++的特性是:对象=算法+数据结构;程序=对象+对象+对象。

区别:在c语言中个成员他们的默认存储控制是public 而c++类中默认的存储控制是private.; 上面的rp()事成员函数,如果我们有如下定义: Test a;的话,调用rp()就可以写成: a. rp();成员函数的调用和普通成员的调用方式一致都采用“.”的操作符。

例如: class test {private://私有成员类外不能够直接访问 int number;public://共有成员类外可以直接访问 float socre; public: int rp() {return number; } void setnum(int a) {number=a; } };void main() { test a; //a.number=10;//错误的,私有成员不能外部访问 a.socre=99.9f; cout<<a.socre<<endl;a.setnum(100);//通过共有成员函数setnum()间接对私有成员number函数进行访问 cout<<a.rp(); cout<<endl; }/*int pp=0; class test {private: int number; public: float socre; int pp; public: void rp(); };void test::rp() { ::pp=11; pp=100; }void main() { test a; test b; a.rp(); cout<<pp<<endl; cout<<a.pp<<endl; }*/利用域区分符我们可以在类定义的外部设置成员函数,但要注意的是,在类的内部必须预声明:类型类名 :: 函数名()=值void test::rp()在函数类型的后面加上类的名称再加上域区分符(::)再加函数名称,利用这样的方法我们就在类的外部建立了一个名为rp 的test类大成员函数(方法),可能很多人要问,这么做有意义吗?在类的内部写函数代码不是更好?答案是这样的:在类的定义中,一般成员函数的规模一般都比较小,而且一些特殊的语句是不能够使用的,而且一般会被自动的设置成为inline(内联)函数,即使你没有明确的声明为inline,那么为什么有会被自动设置成为inline呢?因为大多数情况下,类的定义一般是放在头文件中的,在编译的时候这些函数的定义也随之进入头文件,这样就会导致被多次编译,如果是inline的情况,函数定义在调用处扩展,就避免了重复编译的问题,而且把大量的成员函数都放在类中使用起来也十分不方便,为了避免这种情况的发生,所以c++是允许在外部定义类的成员函数(方法)的,将类定义和其它成员函数定义分开,是面向对象编程的通常做法,我们把类的定义在这里也就是头文件了看作是类的外部接口,类的成员函数的定义看成是类的内部实现。

面向对象

面向对象

面向对象面向对象(Object Oriented,OO)是当前计算机界关心的重点,它是90年代软件开发方法的主流。

面向对象的概念和应用已超越了程序设计和软件开发,扩展到很宽的范围。

如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。

定义首先根据客户需求抽象出业务对象;然后对需求进行合理分层,构建相对独立的业务模块;之后设计业务逻辑,利用多态、继承、封装、抽象的编程思想,实现业务需求;最后通过整合各模块,达到高内聚、低耦合的效果,从而满足客户要求。

在Java中,面向对象可以看成面向抽象和面向接口编程。

浅谈面向对象谈到面向对象,这方面的文章非常多。

但是,明确地给出对象的定义或说明对象的定义的非常少——至少我现在还没有发现。

起初,“面向对象”是专指在程序设计中采用封装、继承、多态等设计方法。

可是,这个定义显然不能再适合现在情况。

面向对象的思想已经涉及到软件开发的各个方面。

如,面向对象的分析(OOA,Object Oriented Analysis),面向对象的设计(OOD,Object Oriented Design)、以及我们经常说的面向对象的编程实现(OOP,Object Oriented Programming)。

许多有关面向对象的文章都只是讲述在面向对象的开发中所需要注意的问题或所采用的比较好的设计方法。

看这些文章只有真正懂得什么是对象,什么是面向对象,才能最大程度地对自己有所裨益。

这一点,恐怕对初学者甚至是从事相关工作多年的人员也会对它们的概念模糊不清。

面向对象的分解根据抽象关键的问题域来分解系统。

面向对象的设计是一种提供符号设计系统的面向对象的实现过程,它用非常接近实际领域术语的方法把系统构造成“现实世界”的对象。

一、传统开发方法存在问题1.软件重用性差重用性是指同一事物不经修改或稍加修改就可多次重复使用的性质。

软件重用性是软件工程追求的目标之一。

面向对象的概念是什么?和面向过程有什么区别

面向对象的概念是什么?和面向过程有什么区别

面向对象的概念是什么?和面向过程有什么区别?面向对象是尽可能模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类认识世界解决问题的方法与过程。

面向过程,也就是结构化程序设计是一种自顶向下逐步求精的设计方法,和单入口单出口的程序结构。

面向对象的概念,特点是什么?1.编程模型所有计算机均由两种元素组成:代码和数据.精确的说,有些程序是围绕着"什么正在发生"而编写,有些则是围绕"谁正在受影响"而编写的.第一种编程方式叫做"面向过程的模型",按这种模型编写的程序以一系列的线性步骤(代码)为特征,可被理解为作用于数据的代码.如C 等过程化语言.第二种编程方式叫做"面向对象的模型",按这种模型编写的程序围绕着程序的数据(对象)和针对该对象而严格定义的接口来组织程序,它的特点是数据控制代码的访问.通过把控制权转移到数据上,面向对象的模型在组织方式上有:抽象,封装,继承和多态的好处.2.抽象面向对象程序设计的基本要素是抽象,程序员通过抽象来管理复杂性.管理抽象的有效方法是使用层次式的分类特性,这种方法允许用户根据物理含义分解一个复杂的系统,把它划分成更容易管理的块.例如,一个计算机系统是一个独立的对象.而在计算机系统内部由几个子系统组成:显示器,键盘,硬盘驱动器,DVD-ROM,软盘,音响等,这些子系统每个又由专门的部件组成.关键是需要使用层次抽象来管理计算机系统(或其他任何复杂系统)的复杂性.面向对象程序设计的本质:这些抽象的对象可以被看作具体的实体,这些实体对用来告诉我们作什么的消息进行响应./* (我的理解)*计算机是一个实体,我要输入字符,显示器显示出来,那么*计算机(对象).输入(键盘属性).显示(显示方法)*使用分层来引用,操作.而不用管计算机内部如何处理.*只要有计算机对象,它就能响应我的操作,而我敲键盘,*计算机对象就把这个消息传给屏幕,屏幕显示.*/计算机对象包含了它所有的属性,以及操作,这就是面向对象程序设计的三大原则之一:封装.3.封装封装是一种把代码和代码所操作的数据捆绑在一起,使这两者不受外界干扰和误用的机制.封装可被理解为一种用做保护的包装器,以防止代码和数据被包装器外部所定义的其他代码任意访问.对包装器内部代码与数据的访问通过一个明确定义的接口来控制.封装代码的好处是每个人都知道怎样访问代码,进而无需考虑实现细节就能直接使用它,同时不用担心不可预料的副作用.在JAVA中,最基本的封装单元是类,一个类定义着将由一组对象所共享的行为(数据和代码).一个类的每个对象均包含它所定义的结构与行为,这些对象就好象是一个模子铸造出来的.所以对象也叫做类的实例.在定义一个类时,需要指定构成该类的代码与数据.特别是,类所定义的对象叫做成员变量或实例变量.操作数据的代码叫做成员方法.方法定义怎样使用成员变量,这意味着类的行为和接口要由操作实例数据的方法来定义.由于类的用途是封装复杂性,所以类的内部有隐藏实现复杂性的机制.所以JA VA中提供了私有和公有的访问模式,类的公有接口代表外部的用户应该知道或可以知道的每件东西.私有的方法数据只能通过该类的成员代码来访问.这就可以确保不会发生不希望的事情.4.继承继承是指一个对象从另一个对象中获得属性的过程.是面向对象程序设计的三大原则之二,它支持按层次分类的概念.例如,波斯猫是猫的一种,猫又是哺乳动物的一种,哺乳动物又是动物的一种.如果不使用层次的概念,每个对象需要明确定义各自的全部特征.通过层次分类方式,一个对象只需要在它的类中定义是它成为唯一的各个属性,然后从父类中继承它的通用属性.因此,正是由于继承机制,才使得一个对象可以成为一个通用类的一个特定实例.一个深度继承的子类将继承它在类层次中的每个祖先的所有属性.继承与封装可以互相作用.如果一个给定的类封装了某些属性,它的任何子类将会含有同样得属性,另加各个子类所有得属性.这是面向对象程序在复杂性上呈线性而非几何增长的一个重要概念.新的子类继承其所有祖先的所有属性.子类和系统中的其他代码不会产生无法预料的交互作用.5.多态多态是指一个方法只能有一个名称,但可以有许多形态,也就是程序中可以定义多个同名的方法,用"一个接口,多个方法"来描述.可以通过方法的参数和类型引用.6.封装,继承,多态的组合使用在由封装,继承,多态所组成的环境中,程序员可以编写出比面向过程模型更健壮,更具扩展性的程序.经过仔细设计的类层次结构是重用代码的基础.封装能让程序员不必修改公有接口的代码即可实现程序的移植.多态能使程序员开发出简洁,易懂,易修改的代码.例如:汽车从继承的角度看,驾驶员都依靠继承性来驾驶不同类型(子类)的汽车,无论这辆车是轿车还是卡车,是奔驰牌还是菲亚特牌,驾驶员都能找到方向盘,手刹,换档器.经过一段时间驾驶后,都能知道手动档与自动档之间的差别,因为他们实际上都知道这两者的共同超类:传动装置.从封装的角度看,驾驶员总是看到封装好的特性.刹车隐藏了许多复杂性,其外观如此简单,用脚就能操作它.发动机,手刹,轮胎大小的实现对与刹车类的定义没有影响.从多态的角度看,刹车系统有正锁反锁之分,驾驶员只用脚踩刹车停车,同样的接口可以用来控制若干种不同的实现(正锁或反锁).这样各个独立的构件才被转换为汽车这个对象的.同样,通过使用面向对象的设计原则,程序员可以把一个复杂程序的各个构件组合在一起,形成一个一致,健壮,可维护的程序类是对象的抽象,实例是类的实现C++中对象和类有何联系和区别:它的区别就像int a = 0;中的int 和a 的区别一样。

面向对象的三大特性

面向对象的三大特性

面向对象的三大特性收藏面向对象的三个基本特征是:封装、继承、多态。

封装封装最好理解了。

封装是面向对象的特征之一,是对象和类概念的主要特性。

封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

在Java中类中成员的属性有:public,protected,<default>,private,这四个属性的访问权限依次降低。

继承面向对象编程(OOP) 语言的一个主要功能就是“继承”。

继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。

通过继承创建的新类称为“子类”或“派生类”。

被继承的类称为“基类”、“父类”或“超类”。

继承的过程,就是从一般到特殊的过程。

要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。

在某些OOP 语言中,一个子类可以继承多个基类。

但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。

继承概念的实现方式有三类:实现继承、接口继承和可视继承。

Ø实现继承是指使用基类的属性和方法而无需额外编码的能力;Ø接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;Ø可视继承是指子窗体(类)使用基窗体(类)的外观和实现代码的能力。

在考虑使用继承时,有一点需要注意,那就是两个类之间的关系应该是“属于”关系。

例如,Employee 是一个人,Manager 也是一个人,因此这两个类都可以继承Person 类。

但是Leg 类却不能继承Person 类,因为腿并不是一个人。

抽象类仅定义将由子类创建的一般属性和方法,创建抽象类时,请使用关键字Interface 而不是Class。

OO开发范式大致为:划分对象→抽象类→将类组织成为层次化结构(继承和合成) →用类与实例进行设计和实现几个阶段。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《面向对象程序设计》课程设计报告报告题目:所在院系:所在班级:姓名:2011年12月29日目录一、课程设计目的 (3)二、课程设计要求 (3)三、课程设计内容 (3)四、类层次图 (3)五、程序代码 (5)六、调试过程 (24)七、总结 (26)八、参考书目 (26)一、课程设计目的:1、熟练掌握C++的基本知识和技能。

2、掌握面向对象程序设计的基本思路和方法。

3、能够利用所学的知识和技能,解决面向对象程序设计实际应用问题。

二、课程设计要求:1、利用面向对象的方法和C++的编程思想完成设计。

2、在设计过程中要求建立清晰的类层次。

3、在定义和实现类过程中,每个类都要有各自的成员变量和成员函数。

4、注意运用面向对象的机制(继承、派生及多态)来实现课程设计。

三、课程设计内容:设计一个计算图形面积、体积的类库:它的顶层是一个抽象类Shape,第二层是二维图形(TwoDimShape)和三维图形(ThreeShape),第三层是由第二层派生出来的具体图形类,圆、椭圆、矩形、三角形;球体、圆柱体、长方体。

本程序完成的主要功能有:(1)计算二维图形的面积(2)计算三维图形的体积四、类层图:派生关系:基类:Shape基类派生出:二维图形(TwoDimShape)和三维图形(ThreeShape)二维图形派生:圆、椭圆、矩形、三角形三维图形派生:球体、圆柱体、长方体程序内容:定义一个抽象类形状(Shape),包含输入基本图形的信息函数input()、显示基本图形信息函数show(),它们均是纯虚函数。

通过继承派生出二维图形和三维图形,二维图形类中包含输入基本图形的信息函数input()、显示基本图形信息函数show()、计算面积的函数 area(),其中area()函数是虚函数;三维图形类中包含输入基本图形的信息函数input()、显示基本图形信息函数show()、计算体积的函数volume(),其中volume()函数是虚函数;进而,通过继承二维图形类和三维图形类分别派生出具体的图形类,圆、椭圆、矩形、三角形;球体、圆柱体、长方体。

二维图形类派生出的具体图形类中包含输入基本图形的信息函数input()、显示基本图形信息函数show()计算面积的函数area()以及各自的构造函数与默认构造函数;三维图形类派生出的具体的图形类中包含输入基本图形的信息函数input()、显示基本图形信息函数show()、计算体积的函数volume()以及各自的构造函数与默认构造函数。

派生图:五、程序代码:1、总体思路:程序首先建立一个抽象类Shape,作为公共接口;然后构建两个基类:TwoDinShape、ThreeShape,公有继承Shape类;最后再由这两个基类派生出具体的图形类,分别计算其面积和体积,然后在主函数中调用各类中的成员函数,输出结果。

2、详细设计:input():数据输入函数show():输出计算结果area():计算图形的面积volume():计算图形的体积run():定义指针,调用抽象类里的每个函数3、源代码:#include<iostream>#include<string>#include<cmath>#include<cstdlib>using namespace std;const double PI=3.14159;class Shape{virtual void input(){};virtual void show(){};};class TwoDimShape:public Shape{private:double f;public:void input(){cout<<"所选图形的边长:";cin>>f;}void show(){cout<<"所求图形的面积是: "<<endl;}virtual double area()=0;};class ThreeShape:public Shape{private:double f;public:void input(){cout<<"所选图形的边长:";cin>>f;}void show(){cout<<"所求图形的体积是: "<<endl;}virtual double volume()=0;};/*****圆*****/class Circle:public TwoDimShape{double r;public:void input(){cout<<"请输入所要求的圆的半径:";cin>>r;}Circle(){r=0;}Circle(double new_r){r=new_r;}double area(){return PI*r*r;}void show(){cout<<" r="<<r<<endl;cout<<"所求的圆的面积是:"<<PI*r*r<<endl;}};/*****椭圆*****/class Elliptise:public TwoDimShape{double a,b;public:void input(){cout<<"请输入所要求的椭圆的长轴半径和短轴半径:";cin>>a>>b;}Elliptise(){a=0;b=0;}Elliptise(double new_a,double new_b){a=new_a;b=new_b;}double area(){return PI*a*b;}void show(){cout<<" a="<<a<<'\t' <<" b="<<b<<endl;cout<<"所要求椭圆的面积是:"<<PI*a*b<<endl;}};/*****矩形*****/class Rectangle:public TwoDimShape{double width,length;Rectangle(){width=0;length=0;}Rectangle(double new_width,double new_length){width=new_width;length=new_length;}double area(){return width*length;}void input(){cout<<"请输入所要求的矩形的长和宽:";cin>>width>>length;}void show(){cout<<" width="<<width<<'\t' <<" length="<<length<<endl;cout<<"所求的矩形的面积是:"<<width*length<<endl;}};/*****三角形*****/class Triangle:public TwoDimShape{double a,b,c;public:void input(){cout<<"请输入所要求的三角形的三条边:";cin>>a>>b>>c;}Triangle(){b=0;c=0;}Triangle(double new_a,double new_b,double new_c){a=new_a;b=new_b;c=new_c;}double area(){double s=(a+b+c)/2.0;//double area;return (sqrt(s*(s-a)*(s-b)*(s-c)));}void show(){double s=(a+b+c)/2.0;cout<<" a="<<a<<'\t'<<" b="<<b<<'\t'<<" c="<<c<<endl;cout<<"所求三角形的面积是:"<<sqrt(s*(s-a)*(s-b)*(s-c))<<endl;}};/*****球体*****/class Ball:public ThreeShape{double r,v;public:Ball(){r=0;}Ball(double new_r){r=new_r;}double volume(){//double v;v=PI*r*r*r*4/3;return v;}void input(){cout<<"请输入所要求的球体的半径:";cin>>r;}void show(){cout<<" r="<<r<<endl;cout<<"所求的球体的体积是:"<<v<<endl;}};/*****圆柱体*****/class Cylinder:public ThreeShape{double r,height,v;public:Cylinder(){r=0;height=0;}Cylinder(double new_r,double new_height){r=new_r;height=new_height;}double volume(){//double v;v=PI*r*r*height;return v;}void input(){cout<<"请输入所要求的椭圆的底面半径和高:";cin>>r>>height;}void show(){cout<<" r="<<r<<'\t'<<" height="<<height<<endl;cout<<"所求圆柱体的体积是:"<<v<<endl;}};/*****长方体*****/class Box:public ThreeShape{double width,length,height,v;public:Box(){width=0;length=0;height=0;}Box(double new_width,double new_length,double new_height){width=new_width;length=new_length;height=new_height;}double volume(){//double v;v=width*length*height;return v;}void input(){cout<<"请输入所要求长方体的长、宽、高:";cin>>length>>width>>height;}void show(){cout<<" width="<<width<<'\t' <<" length="<<length<<'\t'<<" height="<<height<<endl;cout<<"所求长方体的体积是:"<<v<<endl;}};void run1(TwoDimShape *ptr)//定义指针,调用抽象类里的每个函数{ptr->input();ptr->area();ptr->show();}void run2(ThreeShape *ptr){ptr->input();ptr->volume();ptr->show();}void area(const& i,bool& flag){TwoDimShape *p1;Circle circle;Elliptise elliptise;Rectangle rectangle;Triangle triangle;switch(i){case '1':p1=&circle;run1(p1);break;case '2':p1=&elliptise;run1(p1);break;case '3':p1=&rectangle;run1(p1);break;case '4':p1=&triangle;run1(p1);break;}}void volume(const& i,bool& flag){ThreeShape *p2;Ball ball;Cylinder cylinder;Box box;switch(i){case '1':p2=&ball;run2(p2);break;case '2':p2=&cylinder;run2(p2);break;case '3':p2=&box;run2(p2);break;}}int main(){TwoDimShape *p1;ThreeShape *p2;char i;Circle circle;Elliptise elliptise;Rectangle rectangle;Triangle triangle;Ball ball;Cylinder cylinder;Box box;bool flag=1;//退出标记,为0退出或返回上级 cout<<"进入程序:\n";do{cout<<" [1] TwoDimShape \n"<<" [2] ThreeShape \n"<<" [3] Exit "<<endl;cout<<"请输入所选择的标号:";cin>>i;switch(i){case '1':do{cout<<" [1] 圆"<<'\n'<<" [2] 椭圆"<<'\n'<<" [3] 矩形"<<'\n'<<" [4] 三角形"<<endl;cout<<"请输入所选图形的标号:";cin>>i;area(i,flag);}while(flag);flag=1;//保证flag为1,不至于影响后面的使用 break;case '2':do{cout<<" [1] 球体"<<'\n'<<" [2] 圆柱体"<<'\n'<<" [3] 长方体"<<endl;cout<<"请输入所选图形的标号:";cin>>i;volume(i,flag);}while(flag);flag=1;break;default:return 0;}}while(flag);}六、调试过程:七、总结:在程序的编写过程中遇到很多麻烦,譬如:如何定义成员函数,把哪个函数定义为虚函数,对各个层次类的成员函数的声明或定义等,但最后在老师和同学的帮助下都解决了,这让我觉得很有成就。

相关文档
最新文档