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)和"实例" ...
随机推荐
- Matrix Walk CodeForces - 954C
题意: 就是给出一连串的数字 这些数字是从第一个数字依次走过的 emm..就是这样.. 然后让你判断这个矩阵是否存在 如果存在输出行和列的数量 其中行..开到最大就好了...主要是判断列 在输入 ...
- 【总结】Link-Cut Tree
这是一篇关于LCT的总结 加删边的好朋友--Link Cut Tree Link-Cut Tree,LCT的全称 可以说是从树剖引出的问题 树剖可以解决静态的修改或查询树的链上信息:那如果图会不断改变 ...
- 【BZOJ5415】【NOI2018】归程(克鲁斯卡尔重构树)
[NOI2018]归程(克鲁斯卡尔重构树) 题面 洛谷 题解 我在现场竟然没有把这道傻逼题给切掉,身败名裂. 因为这题就是克鲁斯卡尔重构树的模板题啊 我就直接简单的说一下把 首先发现答案就是在只经过海 ...
- ss命令用法小记
By francis_hao Nov 4,2017 ss是一个查看socket的实用工具 概要 ss [options] [ FILTER ] 描述 ss可以查看socket的统计信息, ...
- Codeforces Round #286 (Div. 2) B 并查集
B. Mr. Kitayuta's Colorful Graph time limit per test 1 second memory limit per test 256 megabytes in ...
- Codeforces 894.D Ralph And His Tour in Binary Country
D. Ralph And His Tour in Binary Country time limit per test 2.5 seconds memory limit per test 512 me ...
- [ldap]slapcat/ldapsearch与ldap备份
http://serverfault.com/questions/577356/ldap-backup-with-slapcat-vs-ldapsearch Used: openldap-server ...
- Libevent学习笔记(四) bufferevent 的 concepts and basics
Bufferevents and evbuffers Every bufferevent has an input buffer and an output buffer. These are of ...
- linux shell学习三
Shell for循环 Shell for循环的语法如下所示 for 变量 in 列表 do command1 command2 ... commandN done 举例: ..} do echo $ ...
- Lucene 查询分页技术
常用的Lucene查询代码如下所示,该代码的作用是将path路径下的所有索引信息返回 public String matchAll(String path) { try { Directory dir ...