1楼:帅的都想毁容
接口的好处很多
以c++为例 可以以子类指针动态找到某个方法的实现(不同子类实现不同)
可以实现跨平台功能
可以实现接口功能模块及调用接口的模块的同时开发总之好处很多
c++中的虚函数和java中的抽象方法有什么区别?
2楼:南在南方之南
c++虚函数
与java中抽象函数比较
1:java中没有虚函数的概念,但是有抽象函数的概念,用abstract关键字表示,java中抽象函数必须在抽象类中,而且抽象 函数不能有函数体,抽象类不能被实例化,只能由其子类实现抽象函数,如果某个抽象类的子类仍是抽象类,那么该子类不需要实现其父类的抽象函数。
2:c++中的有虚函数的概念,用virtual 关键字来表示,每个类都会有一个虚函数表,该虚函数表首先会从父类中继承得到父类的虚函数表, 如果子类中重写了父类的虚函数(不管重写后的函数是否为虚函数),要调用哪个虚函数,是根据当前实际的对象来判断的(不管指针所属类型是否为当前类,有可 能是父类型),指针当前指向的是哪种类型的对象,就调用哪个类型中类定义的虚函数。每个类只有一张虚拟函数表,所有的对象共用这张表。
c++的函数多态就是通过虚函数来实现的。
3:c++中,如果函数不是虚函数,则调用某个函数,是根据当前指针类型来判断的,并不是根据指针所指向对象的类型。
4:java中,如果函数不是抽象函数,而是一个普通函数,它是默认实现类似c++中虚函数功能的,也就是说,调用某个函数,是根据当前指针所指向对象的类型来判断的,而不是根据指针类型判断。正好与c++中的普通函数相反。
即:java里自动实现了虚函数。
c++ java
虚函数 -------- 普通函数
纯虚函数 -------- 抽象函数
抽象类 -------- 抽象类
虚基类 -------- 接口
纯虚函数: 主要特征是不能被用来声明对象,是抽象类,是用来确保程序结构与应用域的结构据具有直接映射关系的设计工具。带有纯虚函数的类称为抽象类,抽象类能被子类 继承使用,在子类中必须给出纯虚函数的实现,如果子类未给出该纯虚函数的实现,那么该子类也是抽象类,只有在子类不存在纯虚函数时,子类才可以用来声明对 象!
抽象类也能用于声明指针或引用,或用于函数声明中。具有抽象类特性的类还有构造函数和析构函数,全部是保护的类。如果没有给出纯虚函数的实现,则在它 所在的类的构造函数或析构函数中不能直接或间接的调用它。
纯虚函数的实现可以在类声明外进行定义。
5. c++中一般都是把析构函数声明为虚函数。因为虚函数可以实现动态绑定,也就是到底调用哪个函数是根据指针当前指向哪个对象来确定的,不是根据指针的类型来确定。
如果c++中不把析构函数声明为虚函数,那么其有个子类,重写了虚函数,那么当父类指针指向一个子类对象时,当调用析构函数时,只调用父类的析构函数,而无法调用子类的析构函数,所以一般情况是把析构函数声明为虚函数,实现动态绑定。当然如果一个类不包含虚函数,这经常预示不打算将它作为基类使用。当一个类不打算作为基类时,将析构函数声明为虚拟通常是个坏主意。
标准 string 类型不包含虚函数,如果把string作为基类继承得到子类会出问题。
总之:多态基类应该声明虚析构函数。如果一个类有任何虚函数,它就应该有一个虚析构函数;如果不是设计用于做基类或不是设计用于多态,这样的类就不应该声明虚析构函数。
关于接口与抽象类:
c++中没有接口的概念,与之对应的是纯虚类,即只含有纯虚函数的类,c++抽象类的概念是含有纯虚函数成员的类。这是因为c++提供多继承,而像java、c#这些只提供单继承(避免多继承的复杂性和低效性)的语言为了模拟多继承功能就提供了接口概念,接口可以继承多个。
abstract class是抽象类,至少包含一个纯虚函数的类就叫做抽象类。
但是如果一个类,所有的成员都是纯虚函数,那么它和一般的抽象类在用法上是有区别的。至少microsoft给的***接口定义全部都是仅由纯虚函数构成的类。因此把这样的类定义叫做纯虚类也不算错。
纯虚函数和虚函数的区别在于前者不包含定义,而后者包含函数体。
那么纯虚类就是不包含任何实现(包括成员函数定义和成员变量定义。前者代表算法,后者代表结构)。不包含任何算法和结构的类叫做纯虚类,应该没有问题。
在java里面的确没有纯虚类的概念,因为java里没有纯虚函数这个概念。java管虚函数叫做abstract function,管抽象类叫做abstract class,直接说来,java根本没有virtual这个关键字,都用abstract代替,因此java里面根本就没有pure这个概念。有那就是inte***ce。
在inte***ce里面定义的函数都不能有函数体,这个在java里面叫做接口。那么c++里面与inte***ce等同的概念就是纯虚类了,c++用纯虚类来模拟inte***ce这个抽象概念,因此这里说的“纯虚类”与java的abstract class不同,与c++的一般抽象类也不同。“纯虚类”与c++一般抽象类的区别就好比java里面inte***ce 和 abstract class的区别。
抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出。如果派生类中没有重新定义纯虚函数,而只是继承基类的纯虚函数,则这个派生类仍然还是一个抽象类。如果派生类中给出了基类纯虚函数的实现,则该派生类就不再是抽象类了,它是一个可以建立对象的具体的类。
抽象类是不能定义对象的。
3楼:真三国无双ol哇
java中inte***ce和抽象类都有抽象方法,并且抽象方法必须在子类中实现,c++中比较灵活,如果声明为纯虚函数则不需要再父类中实现,否则需要在父类中实现,这个只是语言的不同机制而已,不需要太纠结,它们的目的都是为了实现面向对象的多态机制
c++中纯虚函数有什么作用?
4楼:何度千寻
通过它可以指明一个虚拟函数只是提供了一个可被子类型改写的接口。
纯虚函数是在基类中声明的虚函数,它可以在基类中有定义,而且派生类必须定义自己的实现方法。基类不能生成对象,可以使用指针或者引用派生类对象。基类不在基类中实现纯虚函数的方法是在函数原型后加“=0”
virtual void funtion1()=0引入原因/纯虚函数的作用
为了方便使用多态特性,我们常常需要在基类中定义虚拟函数。
在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。
为了解决上述问题,引入了纯虚函数的概念,将函数定义为纯虚函数(方法:virtual returntype function()= 0;),则编译器要求在派生类中必须予以重写以实现多态性。同时含有纯虚拟函数的类称为抽象类,它不能生成对象。
这样就很好地解决了上述两个问题。
5楼:匿名用户
四个字:制定
标准纯虚函数是为你的程序制定一种标准,即只要你继承了我,就必须按照我和标准来,实现我所有的方法,否则你也是虚拟的,和java里的接口一样,都是制定标准,为了使程序更加通用化,可重用性提高,让所有实现它或继承自它的子类全部按同一标准来工作,你想想大家都按标准来对程序的益处是什么?
6楼:匿名用户
1。父类中如果都是纯虚函数,那么此父类可以作为接口(inte***ce)。
2。父类中存在纯虚函数,子类中重写(override)该函数,可实现多态。
c++中的接口和java接口的区别
7楼:匿名用户
c++原来没有接口的概念,新标准也许有
不过接口应该是一样的,如果存在
8楼:来宾你好闯天涯
java 里面的接口是可以多继承。
c/c++面试题:虚函数与纯虚函数有什么区别
9楼:匿名用户
虚函数和纯虚函数有以下所示方面的区别
(1)类里如果声
明了虚函数,这个函数是实现的,哪怕是空实现,它的作用就是为了能让这个函数在它的子类里面可以被覆盖,这样的话,这样编译器就可以使用后期绑定来达到多态了。纯虚函数只是一个接口,是个函数的声明而已,它要留到子类里去实现。
(2)虚函数在子类里面也可以不重载的;但纯虚函数必须在子类去实现,这就像java的接口一样。通常把很多函数加上virtual,是一个好的习惯,虽然牺牲了一些性能,但是增加了面向对象的多态性,因为很难预料到父类里面的这个函数不在子类里面不去修改它的实现。
(3)虚函数的类用于“实作继承”,继承接口的同时也继承了父类的实现。当然大家也可以完成自己的实现。纯虚函数关注的是接口的统一性,实现由子类完成。
(4)带纯虚函数的类叫虚基类,这种基类不能直接生成对象,而只有被继承,并重写其虚函数后,才能使用。这样的类也叫抽象类。
c++中纯虚函数可以有函数体吗?
10楼:匿名用户
可以有,但是没必要这样做,好得设计不会这样设计的。这只是概念问题。知道可以就可以了
1l说的不确切。纯虚函数添加函数体,依旧为纯虚函数,类依旧是抽象类,不能实例化
2l说的很明确,既然纯虚函数所在的类为抽象,那么为纯虚函数添加函数体是完全没有必要的。可以有函数体,但是这不是一种好得设计方式。既然是公共接口,添加函数体多此一举。
11楼:匿名用户
***下面是我暂时想到的,不知道我的理解是否正确***
*** 如果学习c++ 的话,不防看看《c++ 编程思想》两卷 ***
为什么要引入纯虚函数?如果它有了函数体,那它还是纯虚函数吗?
1) 含有纯虚函数的类叫做抽象类,抽象类从概念上理解,就是不能实例化对象。
如 对于下面的类来说,
class abstractc
;当声明一个abstractc objab; 时就会报error。
但从implementation 实现来理解,抽象类对象可以作为一个占位符(只能使用指针或引用)
void globalfun( abstractc *inputobj);
即任何实现了abstractc的类都是可以作为globalfun的参数。(这里是pubblic inheritation, 但不能引入新的函数,除非做类型转换)。
2) 如果它有了函数体,即如下:
class abstractc
};因为任何包含纯虚函数的类都是抽象类,即abstractc不能声明对象,不能实例化对象。那么这个类的成员函数的函数体能做什么??所以,加个函数体,就是非常非常不必要了。
因此,纯虚函数是为了定义抽象类(如abstractc),抽象类可以作为公共接口(如globalfun)来使用。