`
yangliuy
  • 浏览: 69533 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

C++虚函数与JAVA中抽象函数比较 接口与抽象类比较

 
阅读更多

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给的com接口定义全部都是仅由纯虚函数构成的类。因此把这样的类定义叫做纯虚类也不算错。

纯虚函数和虚函数的区别在于前者不包含定义,而后者包含函数体。

那么纯虚类就是不包含任何实现(包括成员函数定义和成员变量定义。前者代表算法,后者代表结构)。不包含任何算法和结构的类叫做纯虚类,应该没有问题。

在java里面的确没有纯虚类的概念,因为java里没有纯虚函数这个概念。java管虚函数叫做abstract function,管抽象类叫做abstract class,直接说来,java根本没有virtual这个关键字,都用abstract代替,因此java里面根本就没有pure这个概念。有那就是interface。在interface里面定义的函数都不能有函数体,这个在java里面叫做接口。那么c++里面与interface等同的概念就是纯虚类了,c++用纯虚类来模拟interface这个抽象概念,因此这里说的“纯虚类”与java的abstract class不同,与c++的一般抽象类也不同。“纯虚类”与c++一般抽象类的区别就好比java里面interface 和 abstract class的区别。

抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出。如果派生类中没有重新定义纯虚函数,而只是继承基类的纯虚函数,则这个派生类仍然还是一个抽象类。如果派生类中给出了基类纯虚函数的实现,则该派生类就不再是抽象类了,它是一个可以建立对象的具体的类。

抽象类是不能定义对象的。


来源:http://www.cnblogs.com/yhlx/articles/2177756.html

分享到:
评论

相关推荐

    C++的虚函数和JAVA的抽象函数

    本文将深入探讨C++的虚函数和Java的抽象函数。 首先,C++的虚函数是通过在函数声明前添加`virtual`关键字来实现的。虚函数的主要作用是在运行时确定调用哪个函数,这种机制称为动态绑定或晚期绑定。例如,如果有...

    Java与C++在虚函数,纯虚函数上的区别

    总结来说,Java与C++在处理虚函数、纯虚函数和抽象类方面有着根本的不同。Java通过抽象方法和抽象类来实现多态,而C++则通过虚函数和纯虚函数机制。了解这些差异对于跨语言编程或理解和维护不同语言编写的代码至关...

    java和c++比较--虚函数和指针

    本文将基于“Java和C++比较--虚函数和指针”的主题,深入探讨两种语言在虚函数机制与指针使用上的差异,以及这些差异如何影响程序设计和性能。 ### 虚函数机制 #### C++中的虚函数 在C++中,虚函数是实现多态性的...

    Java,C#,C++在继承,覆盖和多态,抽象类等几个方面的比较归纳

    C++的抽象类还可以包含非虚函数,而Java和C#的抽象方法必须在子类中实现。 在继承树中,接口在Java和C#中扮演重要角色。Java的接口完全是抽象的,不允许有方法实现。C#中的接口也类似,但C#4.0引入了“默认接口实现...

    4.2C++之虚函数共5页.pdf.zip

    6. **多态与接口**:虚函数使得C++可以模拟类似Java中的接口,虽然C++没有内置接口类型,但通过纯虚函数的抽象类可以实现类似功能。 7. **成员访问权限与虚函数**:虚函数可以是公有、保护或私有的,但通常为了使...

    安卓虚函数解密。。。

    这里我们将深入探讨Android中C++虚函数的概念、工作原理以及如何在实际开发中应用。 虚函数(Virtual Function)是C++中的一个关键字,用于定义基类接口,以便于在派生类中重写。当基类指针指向派生类对象时,通过...

    面向对象编程C++和Java比较教程 中英文完整版 pdf

    然而,C++的多态主要通过虚函数和模板实现,而Java则依赖于接口和抽象类。C++的模板允许泛型编程,可以在编译时生成针对不同类型的代码,而Java的泛型是在运行时检查类型安全性的。 在异常处理方面,C++使用try-...

    C++和Java多态的区别

    - **虚函数表 vs 方法表**:C++中的虚函数调用依赖于虚函数表,而Java则是通过方法表来实现多态。 - **运行时类型信息**:C++提供RTTI机制来支持运行时类型识别,Java则通过方法表和JVM的动态绑定机制来实现。 - **...

    C++接口实现总结

    在C++编程中,接口(Interface)的概念通常与面向对象编程相关,它是定义类或对象行为的一种规范。虽然C++语言本身并没有直接提供接口的概念,但可以通过一些技巧来模拟接口的实现。这篇博客"《C++接口实现总结》...

    java转C++,专用工具类

    转换工具需要处理这种差异,如将Java的接口映射为C++的虚函数或纯抽象类,将Java的引用映射为C++的指针或智能指针等。 3. **内存管理**:Java的垃圾回收机制在C++中不存在,因此需要手动管理内存。转换时要考虑如何...

    JAVA与C++的区别

    - **多态性**:C++主要通过虚函数和虚基类实现多态性,Java引入了接口和抽象类,使得多态性更为灵活。 - **封装**:Java的包(package)机制使面向对象和组件开发更为简便,而C++需要其他方法来实现类似功能。 4....

    C++中接口的实现.pdf

    ### C++中接口的实现详解 #### 接口的概念与重要性 接口,作为软件设计中的关键概念之一,主要用于定义类的行为规范,而非具体的实现细节。这种设计模式常见于Java、C#等语言中,但在C++中并未直接提供原生支持。...

    多态的实现及虚函数

    当一个类中的函数被声明为虚函数时,这意味着在派生类中可以重写此函数,且通过基类的指针或引用调用时,会调用相应对象实际所属类的版本,而非基类的版本。 例如,考虑一个`Weapon`基类和两个派生类`Sword`和`Gun`...

    使用C、C++、Java实现面向对象demo

    在学习过程中,可以对比分析C++的虚函数和Java的接口,理解它们如何实现多态;也可以研究C++的模板和Java的泛型,探讨静态多态和动态多态的区别。总之,面向对象编程是现代软件开发中的重要工具,熟练掌握C、C++、...

    虚函数与纯虚函数(C++与Java虚函数的区别)的深入分析

    虚函数和纯虚函数是面向对象编程中的两个关键概念,主要在C++和Java中发挥作用。本文将深入探讨这两种函数的定义、用途以及它们在两种语言中的差异。 首先,让我们来理解虚函数。在C++中,虚函数是通过在基类中使用...

    浅谈java的接口和C++虚类的相同和不同之处

    - C++的虚类通过使用`virtual`关键字指定虚函数,而Java的接口通过`implements`关键字来实现。 总的来说,C++的虚类更倾向于提供一部分实现,而Java的接口更注重于定义行为规范。选择使用哪一个取决于具体的设计...

    The diffenences bwtween Java and C++ (JAVA与C++区别)

    起初,C++作为C语言的增强版本出现,从C类型的起点不断添加新特性,如虚函数(virtual function)、运算符重载(operator overloading)、多重继承(multiple inheritance)、模板(template)、异常处理(exception...

Global site tag (gtag.js) - Google Analytics