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)和"实例" ...
随机推荐
- 洛谷 P2574 XOR的艺术
刚刚学了,线段树,一道线段树入门题试试水 下面是题面 题目描述 AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个 ...
- BGP与BGP机房 国内网络运营商的主流网关解决方案
边界网关协议(BGP)是运行于 TCP 上的一种自治系统的路由协议. BGP 是唯一一个用来处理像因特网大小的网络的协议,也是唯一能够妥善处理好不相关路由域间的多路连接的协议. BGP 构建在 EGP ...
- CVE-2017-16995 Ubuntu16.04本地提权漏洞复现
0x01 前言 该漏洞由Google project zero发现.据悉,该漏洞存在于带有 eBPF bpf(2)系统(CONFIG_BPF_SYSCALL)编译支持的Linux内核中,是一个内存任意 ...
- Dll劫持漏洞详解
一.dll的定义 DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型.在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分 ...
- python的复制,深拷贝和浅拷贝的区别(转)
在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用 一般有三种方法, alist=[1,2,3,[& ...
- Leetcode 7. 整数反转(待整理)
1.题目描述 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: ...
- PhpStorm 快速查找文件 `Ctrl`+`Shift`+`N`
PhpStorm 快速查找文件 `Ctrl`+`Shift`+`N`
- socketserver多线程处理
一.简介 SocketServer简化了网络服务器的编写.在进行socket创建时,使用SocketServer会大大减少创建的步骤,并且SocketServer使用了select它有5个类:Base ...
- python 获取文件md5
def GetFileMd5(filename): if not os.path.isfile(filename): return myhash = hashlib.md5() f = file(fi ...
- php 傻瓜式代码计算两个时间间隔
$stamp = (strtotime($_POST['start'])-strtotime($_POST['end'])); $s = $stamp%60; //秒 $m_stamp= ($stam ...