• C++ 和Java继承机制的比较


    摘要:

          C++支持类的多继承,而Java采用类的单继承。C++中的继承成分只有类(模板属于带参数的类,结构和联合是特殊的类),Java中除了类还有接口的继承,而且允许接口的多继承,可以间接地实现类多继承的功能。 类的多继承有其灵活性,但语义复杂给使用带来了困难。Java中引入了接口,接口中定义了一组协议规范,即方法原型。将方法的实现部分推迟到类中完成,从而将接口继承与实现继承分开。接口继承可以间接替代多继承,具有多继承的优点,而且使用简单。

    为什么Java不支持类的多继承(或者说不直接支持)?

       多继承是面向对象技术的有力工具,其复杂的语义给实现带来很多困难。Java放弃了类的多继承的直接原因是为了降低语言的复杂程度,但多继承又有其存在的必要,因为引入了接口,替代类的多继承。

    多继承的复杂语义

        多继承允许从多个直接父类派生子类,继承层次形成一个有向无环图。采用多继承必须解决的主要问题有:

    1) 名字冲突

        不同父类中可能存在名字相同的属性。当子类继承父类的属性时,来自于不同父类的同名属性产生了冲突,导致名字的二义性。为了消除二义性,C++用成员名限定(类名:成员名)指出该成员属于哪个父类,要做到这一点,必须十分了解类的继承层次。

    2) 重复继承

       如果子类的多个父类有共同祖先类,出现了重复继承。如图1所示,类Student-in-job重复继承祖先类Person.分别来自父类Student和Faculty.

       重复继承有两种不同实现方式:复本继承和共享继承,两者的差异体现在类的实例对象分配的存储空间上。

     (1)复本继承(replication inheritance)

        采用复本继承无须使用virtual修饰继承方式,类Student-in-job的实例对象中,包含了Student子对象和Faculty子对象,占据不同的存储空间,这两个子对象中各有一个Person子对象,这里,复本指的是类Student-in-job的对象中有两个Person子对象,它们存放不同的属性值。存储结构如图2所示

     (2) 共享继承

        若要求子类的实例对象中只有一个祖先类的子对象,而不是为来自于不同继承路径的祖先类分别保存一个子对象,可用virtual修饰继承说明。编译器为Student子对象和Faculty子对象分别设置一个指向基类Person子对象的指针,在类Student-in-job的对象中只存在一个共享的基类Person子对象,存储结构如图3.

       在C++中,继承的粒度是整个类,而不是单个属性或方法。因而,只能选择共享祖先类的所有属性,或者使用祖先类所有属性的复本,无法共享祖先类中的部分属性而使用另一些属性的复本。

  • 相关阅读:
    zoj1028-Flip and Shift
    OSI七层模型基础知识及各层常见应用
    隐藏AutoCompleteTextView下拉框的滚动条
    VC++笔记七
    [置顶] 无名管道的C++封装
    张佩的Dump服务
    Oracle Autonomous Transactions(自治事务)
    Computational Geometry Template
    普通人和牛人之间的差距之举一反三能力
    关于选择
  • 原文地址:https://www.cnblogs.com/hubavyn/p/4355943.html
Copyright © 2020-2023  润新知