抽象类的作用是为一个派生类族建立一个公共接口(C++中 抽象类和虚基类用途上有什么区别)
本文目录
C++中 抽象类和虚基类用途上有什么区别
语法上有抽象类和虚基类,不等于你一定要用它。花里胡哨的东西,我通常不用。我能想到的抽象类用处,大概这个优点可以用一用:含有纯虚函数的类都是抽象类。基类中实际上并不使用这个函数,它只是通知编译系统:在这里声明一个虚函数,留待在派生类中定义。为一个类族提供一个公共接口。例如,计算平面形状的面积,抽象类 基类中 virtual float area( ) const =0; 派生类三角形,派生类圆 各自定义了 area( ) 具体的计算。一旦有了派生的三角形或圆,我们可以用同样的函数名.area( ) 计算面积。虚基类,它的构建要在派生类里做,而且先于派生类自己的构建。当有派生类1,派生类2,生成的派生类12时,派生类12只执行一次虚基类的构建。虚基类的对象只有唯一一个。至于它有什么特殊用途,没想到。
可以详细说一下抽象类和接口吗简单易懂一些
普通类中只要含有一个纯虚函数,该类就是抽象类。
1、抽象类只能用作其他类的基类,不能建立抽象类对象,即不可实例化,它只是一种规范、约定、行为说明,子类继承抽象类后,子类对象的函数名参数格式被制约,但是子类函数内部可以实现特有的操作,也就是抽象类具有规范接口的意义,以实现不同子类的调用接口保持一致,但是各自的函数所执行的操作可以独立。
2、抽象类不能用作参数类型、函数返回类型或显式转换的类型,因为不可实例化,所以不占用内存,也不存在地址和指针,所以不可作为参数传递,只可作为派生类的代理。
3、可以定义指向抽象类的指针和引用,此指针可以指向它的派生类,进而实现多态性。
纯虚函数即不带实现的虚函数定义,比如:
virtual int fun()=0;
这样的函数因为没有函数实体,因此子类有义务实现它,从而实现不同派生类之间的同名函数但不同功能的特性,使用抽象类指针访问不同的派生类对象的同名函数,实现动态多态。
father *p;p =new child1();p-》fun();delete p; p=new child2();p-》fun(); delete p;
上述是一个用父类指针多态调用不同子类同名函数的简单例子,以实现不同功能,具体开发时,主程序部分不需要修改,如果要增加一块功能,只需扩展一个派生类就可以实现软件升级,对于大型程序重新编译规划及其有利。
抽象类中的非纯虚函数和成员变量,可以通过派生类访问(当然是公共和保护修饰情况下),因此抽象类本身除了具有规定函数格式(接口的规范标准)外,还提供可被继承的成员变量和函数。
接口
当一个类中只包含纯虚函数时,它完完全全就是个接口。接口中不包含成员变量和其他非纯虚函数,也即类中只包含虚函数说明,而没有其他可供继承的函数和成员变量。
接口是抽象类的升级版,所以也不可实例化,接口的功能完全是为了规范类函数标准,接口可以通过指针导出传递其派生类的地址,其他程序可通过接口指针访问派生类对象,通过接口访问对象,主调者完全不用考虑被调者内部结构和实现逻辑,完全解耦(什么是解耦及其重要性自行百度),仅通过接口提供的函数定义访问派生类实体,完全多态。另外,比如在集团开发时,架构师定义接口,各部门按接口实现派生类工作。
简单的打个比方,接口就是对象之间或者程序之间交互信息的通讯接驳口,就如同电脑网口标准,网卡上网口内的每根导线的定义以及网线上RJ45头内的导线都是根据接口标准设计生产的,因此用户只要带着笔记本跑到任意有网口的地方连上网线就可以上网了,而不用考虑所连接的网络内部是什么厂家生产,这也是就是解耦的一个例子。
纯手打,不知道你能不能看懂^^
抽象类的作用是什么
1、在面向对象方法中,抽象类主要用来进行类型隐藏。构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的。
2、通过从这个抽象体派生,也可扩展此模块的行为功能。为了能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle),抽象类是其中的关键所在。
3、抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。
抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。
通常在编程语句中用 abstract 修饰的类是抽象类。在C++中,含有纯虚拟函数的类称为抽象类,它不能生成对象;在java中,含有抽象方法的类称为抽象类,同样不能生成对象。
抽象类是不完整的,它只能用作基类。在面向对象方法中,抽象类主要用来进行类型隐藏和充当全局变量的角色。
接口和抽象类在面向对象编程中有什么作用
在OOD(面向对象设计)中,经常会用到抽象类或接口,【注:在C++中,没有接口的概念,只有抽象类;而在Java中两者都存在】。而在使用过程中,也许会有不少人认为接口和抽象类差不多,然后就想当然地觉得可以相互完全替换。事实上,虽然他们有很多相似点,但也有很大差异。1.抽象类与接口的出现条件在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表征我们在对问题领 域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。比如:如果我们进行一个图形软件的开发,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。正是因为抽象的概念在问题 领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。在面向对象领域,抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可 以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。熟悉OCP的读 者一定知道,为了能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle),抽象类是其中的关键所在。2.从语法定义层次上区分abstract class和interface在语法层面,Java语言对于abstract class和interface给出了不同的定义方式,下面以定义一个名为Demo的抽象类为例来说明这种不同。使用abstract class的方式定义Demo抽象类的方式如下:abstract class Demo_A { abstract void method1();abstract void method2();… }使用interface的方式定义Demo抽象类的方式如下:interface Demo_I {void method1();void method2();… } 在abstract class方式中,Demo可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface方式的实现中,Demo只能够有静态的、不能被修改的数据成员(也就是必须是static final的,不过在interface中一般不定义数据成员),所有的成员方法都是abstract的。从某种意义上说,interface是一种特殊 形式的abstract class。从编程的角度来看,abstract class和interface都可以用来实现"design by contract"的思想。但是在具体的使用上面还是有一些区别的。首先,abstract class在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是一个类却可以实现多个interface。也许,这是Java语言的设计者在考虑Java对于多重继承的支持方面的一种折中考虑吧。其次,在abstract class的定义中,我们可以赋予方法的默认行为。但是在interface的定义中,方法却不能拥有默认行为。为了绕过这个限制,必须使用委托,但是这会增加一些复杂性,有时会造成很大的麻烦。在抽象类中不能定义默认行为还存在另一个比较严重的问题,那就是可能会造成维护上的麻烦。因为如果后来想修改类(一般通过abstract class或者interface来表示)以适应新的情况(比如,添加新的方法或者给已用的方法中添加新的参数)时,就会非常的麻烦,可能要花费很多的时间(对于派生类很多的情况,尤为如此)。但是如果是通过abstract class来实现的,那么可能就只需要修改定义在abstract class中的默认行为就可以了。同样,如果不能在抽象类中定义默认行为,就会导致同样的方法实现出现在该抽象类的每一个派生类中,违反了"one rule,one place"原则,造成代码重复,同样不利于以后的维护。因此,在abstract class和interface间进行选择时要非常的小心。3.从设计理念层次上区分abstract class和interface上面主要从语法定义和编程的角度论述了abstract class和interface的区别,这些层面的区别是比较低层次的、非本质的。接下来将从abstract class和interface所反映出的设计理念,来分析一下二者的区别。从这个层面进行分析更能理解二者概念的本质所在。前面已经提到过,abstarct class在Java语言中体现了一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is a"关系,即父类和派生类在概念本质上应该是相同的。对于interface 来说则不然,并不要求interface的实现者和interface定义在概念本质上是一致的,仅仅是实现了interface定义的契约而已。为了使论述便于理解,下面将通过一个简单的实例进行说明。考虑这样一个例子,假设在我们的问题领域中有一个关于Door的抽象概念,该Door具有执行两个动作open和close,此时我们可以通过abstract class或者interface来定义一个表示该抽象概念的类型,定义方式分别如下所示:使用abstract class方式定义Door:abstract class Door_A {abstract void open();abstract void close(); } 使用interface方式定义Door:interface Door_I {void open();void close(); } 其他具体的Door类型可以extends使用abstract class方式定义的Door或者implements使用interface方式定义的Door。看起来好像使用abstract class和interface没有大的区别。
java中抽象类的作用是什么
通过继承它实现多态,后期绑定,可以为将来要实现的东西做好接口,实现重用性,例如:abstract class A { public abstract void doSomething();}class B extends A { public void doSomething() { System.out.println("do B"); }}class C extends A { public void doSomething() { System.out.println("do C"); }}public class Test { public static void main(Stringp args) { A a1 = new B(); A a2 = new C(); B b = new B(); C c = new C(); doSomething(a1); //这里 doSomething(a2); //这里 doSomething(b); //这里,如果下面的方法不是用抽象类作参数,比如用C c做参数,这里会有什么问题? doSomething(c); //这里 } public static void doSomething(A a) {//这里,用抽象类,为什么,自己思考 a.doSomething(); }}//这个例子只是抽象类的最基本的设计模式,和接口差不多
本文相关文章:
sometime sometimes(sometime和sometimes有什么区别分别怎么用,请造句举例)
2024年9月10日 10:05
哈希码和磁力衔接有什么区别哈希码怎么用?设随机Hash表的长度为n=8
2024年9月6日 00:55
c语言中函数abs 和 fabs有什么区别?C语言中fabs表示什么意思
2024年9月4日 08:10
slave和slavery有什么区别同样是名词,同样有奴隶的意思?slave的近义词
2024年9月3日 23:15
fgets函数的理解(MATLAB 里面fgets和fgetl有什么区别)
2024年8月26日 04:20
有关javascript的参考文献(javaScript和java有什么区别两者分别运用于哪些方面)
2024年8月22日 22:35
cstring是什么(LPCTSTR和CString有什么区别)
2024年8月21日 05:25
文本编辑器和编译器的区别(编译器跟编辑器有什么区别还有什么是链接器)
2024年8月18日 06:25
快速格式化和普通格式化(电脑正常格式化和快速格式化有什么区别)
2024年8月16日 23:41
lostfocus(VB程序中GotFocus事件和LostFocus事件有什么区别)
2024年8月13日 02:45
jsp与web的区别(java web和jsp做出来的网页有什么区别哪个更容易做动态网站)
2024年8月10日 11:55
sql和excel的区别(数据库 sql 和excel有什么区别为什么我们不用sql呢只有sap)
2024年8月8日 16:25
representation用法(presentation和representation有什么区别)
2024年8月3日 12:30
vb语言是高级语言吗(VB语言和C语言有什么联系吗二者又有什么区别VB语言比C语言高级吗)
2024年7月27日 04:45
forefront(sharepoint和forefront有什么区别)
2024年7月25日 14:55
const和static(c#中static和const有什么区别)
2024年7月24日 16:54
大学嵌入式培养指什么(大学的同一专业,嵌入式培养和非嵌入式培养有什么区别)
2024年7月24日 14:52
iomanip和iostream(c++中的iomainp.h和iostream.h有什么区别)
2024年7月24日 12:03
更多文章:
easyanticheat是啥(eaanticheat启动慢)
2024年7月4日 00:00
windows rt(联想windowsRT可以改成win8的系统吗 )
2024年7月17日 06:42
股票入门基础知识图解(股票k线图入门图解股票k线图入门图解)
2024年6月30日 13:51
xls和xlsx哪个好用(excel表格后缀xlsx和xls的区别)
2024年7月15日 09:18
treeview添加子节点(如何通过代码给treeview添加子节点(C#))
2024年6月6日 00:39
工业机器人INC和DEC指令的功能是什么?汇编语言 DEC指令 要把数转为二进制吗
2024年7月3日 01:49
final在java中的作用(JAVA中final的作用及意思分别是什么)
2024年7月15日 07:06
kindeditor编辑器视频上传(kindeditor富文本编辑器怎样上传flash)
2024年3月17日 06:25