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++中,继承的粒度是整个类,而不是单个属性或方法。因而,只能选择共享祖先类的所有属性,或者使用祖先类所有属性的复本,无法共享祖先类中的部分属性而使用另一些属性的复本。
C++ 和Java继承机制的比较的更多相关文章
- Java面向对象程序设计--与C++对比说明:系列3(Java 继承机制)
继承(inheritance)背后的核心思想是: bonus = b; } } Java没有像C++那样提供多继承机制,但提供了接口机制,在后面我们将详细探究接口机制的实现 ...
- java继承机制
1 继承 关键字:extends java没有多重继承 实例 父类: package unit4; public class Base { public int publicVarofBase= ...
- java的继承机制
这次我想深入探究以下java里类的继承机制. 我们知道,继承是java设计里的一个失败的地方.高司令说过:如果让他重新设计java的话,他会把继承去掉.而java里继承到底怎么了,会这么不 ...
- 第28章 java反射机制
java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...
- java基础知识(十一)java反射机制(上)
java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...
- java基础知识(十一)java反射机制(下)
1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...
- Javascript 构造函数原型继承机制
我们先聊聊Js的历史,1994年Netscape公司发布了Navigator浏览器0.9班.这是历史上第一个比较成熟的网络浏览器.轰动一时.但是,这个版本的浏览器只能用来浏览,不具备交互功能,最主要的 ...
- Java继承与组合
Java继承与组合 继承 java 中使用extends关键字表示继承关系,当创建一个类时,如果没有明确指出要继承的类,则是隐式地从根类Object进行继承. 子类继承父类的成员变量 子类能够继承父类 ...
- javascript继承机制的设计思想(ryf)
我一直很难理解Javascript语言的继承机制. 它没有"子类"和"父类"的概念,也没有"类"(class)和"实例" ...
随机推荐
- BZOJ2716:[Violet 3]天使玩偶——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=2716 样例输入 2 31 12 32 1 21 3 32 4 2 样例输出 1 2 ———————— ...
- 【bzoj4002】有意义的字符串
Portal --> bzoj4002 Solution 虽然说这题有点强行但是感觉还是挺妙的,给你通项让你反推数列的这种==有点毒 补档时间 首先有一个东西叫做特征方程,我们可以 ...
- Howto run google-chrome as root
Just want to add a permanent solution to the problem: 1. Open google-chrome located in /usr/bin with ...
- 洛谷P3048 [USACO12FEB]牛的IDCow IDs
P3048 [USACO12FEB]牛的IDCow IDs 12通过 67提交 题目提供者lin_toto 标签USACO2012 难度普及/提高- 时空限制1s / 128MB 提交 讨论 题解 ...
- C ------ static 关键字的作用
首先要理解生存周期与作用域的区别: 生存周期: 变量从定义到销毁的时间范围.存放在全局数据区的变量的生存周期存在于整个程序运行期间,而存放在栈中的数据则随着函数等的作用域结束导致出栈而销毁,除了静态变 ...
- SQL Server 2008如何开启数据库的远程连接
SQL Server 2008默认是不允许远程连接的,如果想要在本地用SSMS连接远程服务器上的SQL Server 2008,远程连接数据库.需要做两个部分的配置: 1,SQL Server Man ...
- 前端PHP入门-020-重点日期函数之获取时期时间信息函数
你需要知道关于时间的几个概念: 时区/世界时/unix时间戳 1.时区 这个概念,之前大家听说过很多.我们来啰嗦两句,我们现实生活中使用的实区,在电脑里面也是一样有规定的. 1884年在华盛顿召开国际 ...
- ios 虚拟机中文件下载路径
每个人mac上的路径会有不同,你可以打印出你文件下载存放的路径,然后拷贝一下,再单击桌面空白处,最上面的导航栏上有个“前往”,然后找到“前往文件夹”,粘贴一下,就可以找到了.
- css之display:inline-block布局--转
css之使用display:inline-block来布局 css之display:inline-block布局 1.解释一下display的几个常用的属性值,inline , block, in ...
- Excel公式
多个IF =IF(ISNUMBER(SEARCH("lz",E7)),"lz", IF(ISNUMBER(SEARCH("zch",E7)) ...