摘要:

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

C++ 和Java继承机制的比较的更多相关文章

  1. Java面向对象程序设计--与C++对比说明:系列3(Java 继承机制)

    继承(inheritance)背后的核心思想是:       bonus = b;    }      } Java没有像C++那样提供多继承机制,但提供了接口机制,在后面我们将详细探究接口机制的实现 ...

  2. java继承机制

    1 继承  关键字:extends   java没有多重继承 实例 父类: package unit4; public class Base { public int publicVarofBase= ...

  3. java的继承机制

    这次我想深入探究以下java里类的继承机制.       我们知道,继承是java设计里的一个失败的地方.高司令说过:如果让他重新设计java的话,他会把继承去掉.而java里继承到底怎么了,会这么不 ...

  4. 第28章 java反射机制

    java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...

  5. java基础知识(十一)java反射机制(上)

    java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...

  6. java基础知识(十一)java反射机制(下)

    1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...

  7. Javascript 构造函数原型继承机制

    我们先聊聊Js的历史,1994年Netscape公司发布了Navigator浏览器0.9班.这是历史上第一个比较成熟的网络浏览器.轰动一时.但是,这个版本的浏览器只能用来浏览,不具备交互功能,最主要的 ...

  8. Java继承与组合

    Java继承与组合 继承 java 中使用extends关键字表示继承关系,当创建一个类时,如果没有明确指出要继承的类,则是隐式地从根类Object进行继承. 子类继承父类的成员变量 子类能够继承父类 ...

  9. javascript继承机制的设计思想(ryf)

    我一直很难理解Javascript语言的继承机制. 它没有"子类"和"父类"的概念,也没有"类"(class)和"实例" ...

随机推荐

  1. P1939 【模板】矩阵加速(数列)

    题目描述 a[1]=a[2]=a[3]=1 a[x]=a[x-3]+a[x-1] (x>3) 求a数列的第n项对1000000007(10^9+7)取余的值. 输入输出格式 输入格式: 第一行一 ...

  2. IBatis Map报错10.1

    检查 providers.config 把没用的给关闭掉即可

  3. 【SPOJ】QTREE6(Link-Cut-Tree)

    [SPOJ]QTREE6(Link-Cut-Tree) 题面 Vjudge 题解 很神奇的一道题目 我们发现点有黑白两种,又是动态加边/删边 不难想到\(LCT\) 最爆力的做法,显然是每次修改单点颜 ...

  4. Hbase(六) hbase Java API

    一. 几个主要 Hbase API 类和数据模型之间的对应关系: 1. HBaseAdmin关系: org.apache.hadoop.hbase.client.HBaseAdmin作用:提供了一个接 ...

  5. javascript中的位运算,

    罗浮宫群里又有讨论位运算符号|了,做过一段时间php,数据库保存布尔值数据经常用到,比如100110 就表明了六个属性的是与否,极大减少了数据量..] ECMAScript 中位运算跟其他语言一样的. ...

  6. NOIP 2012 洛谷P1081 开车旅行

    Description: 就是两个人开车,只能向东开.向东有n个城市,城市之间的距离为他们的高度差.A,B轮流开车,A喜欢到次近的城市,B喜欢到最近的城市.如果车子开到底了或者车子开的路程已经超过了限 ...

  7. 洛谷 P1486 BZOJ 1503 NOI 2004 郁闷的出纳员 fhq treap

    思路: 1. 此处的fhq treap的分裂是按照权值分裂然后插入的.将小于k的分为一棵子树,大于等于k的分为另一棵子树. 2. 删除的时候只要将大于等于min的分裂到以root为根的树中,另一部分不 ...

  8. C# 利用mysql.data 在mysql中创建数据库及数据表

    C# 利用mysql.data 在mysql中创建数据库及数据表 using System; using System.Collections.Generic; using System.Linq; ...

  9. opencv函数制作的秒针模型

    曾经做过,没想到这次再次写这篇代码却用了这么久的时间.这回我要记住他. #include"cv.h" #include"highgui.h" int main( ...

  10. CSS3笔记-加强版

    属性选择器:   E[attr]只使用属性名,但没有确定任何属性值 E[attr="value"]指定属性名,并指定了该属性的属性值 E[attr~="value&quo ...