(一三七)继承:is-a关系

C++有三种继承方式:

①公有继承;

②保护继承;

③私有继承。

 

 

公有继承是一种is-a关系(也可以理解为is-a-kind-of,一种,但is-a是术语)。任何可以对基类执行的操作,也可以对派生类执行。

 

 

(1)公有继承不建立has-a关系,即一个类中包含另一个类。例如:

class Name
{....

}

class Student

{

Name name;

int id;

....

}

就是一种has-a关系,将Name对象作为Student类的数据成员。

 

(2)公有继承不能建立is-like-a 关系。

不确定:这个关系貌似是指先有一个共同的类,然后以is-a关系或has-a关系,在这个共同的类的基础上定义的相关的两个/多个类。

继承可以在基类的基础上添加属性,但不能删除基类的属性。

 

(3)公有继承不建立is-implemented-as-a(作为...来实现)关系。

例如,数组可以用于实现栈,但不能从数组类派生出栈类来,因为栈不是数组,且也可以通过其他方法来实现栈(如链表)。

不过不明白书上这一句:正确方法是,通过让栈包含一个私有Array对象成员来隐藏数组实现。——这句话意思是这种方法是用数组实现栈的方式么?强调说不能从数组派生出栈?我觉得是。

 

(4)公有继承不建立uses-a关系。

例如A类和B类关系并不大(但有一点关系),然后从A类派生出B类,理论上是可以实现的,只不过这样A类很多数据成员、方法就没意义了。

 

 

在C++中,可以使用公有继承来建立has-a、is-implemented-as-a或uses-a关系,然而,这样做,按书上说法是会导致编程方面的问题,因此应使用is-a关系。

 

 

 

时间: 2024-12-24 22:09:43

(一三七)继承:is-a关系的相关文章

VB.Net中文教程(4) 类别继承(Inheritance)关系

继承|教程|中文 1. 类别之继承 类别之间﹐有些互为独立﹐有些具有密切关系.兹介绍类别间常见的关系──「父子」关系﹔由于儿女常继承父母之生理或心理特征﹐所以又称此关系为「继承」(Inheritance) 关系.类别间之密切关系﹐把相关的类别组织起来﹐并且组织程序内之对象.若程序内之对象毫无组织﹔呈现一片散沙﹐就不是好程序.完美之VB程序﹐必须重视类别间之关系﹐对象是有组织的. 如果 A类别「继承」 B类别﹐则称 A为「子类别」(Subclass)﹐也称B 为「父类别」(Superclass)﹐

泛化、继承、实现、关联、聚合、组合和依赖关系比较

[ 类的关系 ] ① Generalization(泛化) -> { Inheritance(继承),Realization(实现) } ② Association(关联关系) -> { Aggregation(聚合关系),Composition(组合关系) } ③ Dependency(依赖关系) [ 关系详解 ] ① Generalization(泛化) 泛化表现为继承或实现关系(is a).具体形式为类与类之间的继承关系,接口与接口之间的继承关系,类对接口的实现关系. ② Associa

类型转换,类与类之间的转换,继承关系,继承与静态变量,子类父类重名,多继承,虚基类

 常量的基本类型转换,例如:int num(10.8),这种方式是隐式转换. 通过函数的构造函数实现转换. 类类转换函数,当构造函数不能将类型转换成基本类型时.所以就有了类类转换函数,通过这种方式. 案例: #include <iostream> class fushu { public: //通过加explicit的这种方式避免隐式转换,避免引发歧义 explicit fushu(int num) { x = num; y = num; } void print() { std::cou

php利用反射真正实现多继承(非接口模拟)

昨天我在写PHP程序的时候,无意发现在PHP的::操作符非常强大,不仅仅是只用在访问parent,sel,静态成员属性.常量上面,其实他的功能强大了去了 . 这个符号在PHP中实际上叫做范围解析符,这是PHP官方的解释php.net/manual/zh/language.oop5.paamayim-nekudotayim.php.但是官方中文部分只是简单的介绍了 访问parent,sel,静态成员属性.常量的作用,而下面英文部分,可能由于咱们这些吊死对英文不好的缘故,就没看下去了,实现上,下面还

为什么Java中继承是有害的

继承 概述 大多数好的设计者象躲避瘟疫一样来避免使用实现继承(extends 关系).实际上80%的代码应该完全用interfaces写,而不是通过extends."JAVA设计模式"一书详细阐述了怎样用接口继承代替实现继承.这篇文章描述设计者为什么会这么作. Extends是有害的:也许对于Charles Manson这个级别的不是,但是足够糟糕的它应该在任何可能的时候被避开."JAVA设计模式"一书花了很大的部分讨论用interface继承代替实现继承. 好的设

使用Apache OpenJPA开发EJB 3.0应用,第3部分: 实体继承

面向对象和关系型数据库 Java 语言天生就是一门面向对象的编程语言,在 Java 世界中,被处理的内 容都被组织成一个一个的对象,对象和对象之间存在着继承.引用关系,这样的 关系无法通过简单的方式直接映射到关系型数据库中.因此在关系型数据库与面 向对象之间存在着阻抗失谐. 我们通过一个简单的例子来说明这种阻抗失谐给企业应用开发者带来的困难. 假设在企业应用中存在三个 Java 类:Animal.Fish 和 Dog.Animal 仅仅具备 两个属性:id 和 name.Fish 是一种 Ani

为什么Java中继承多数是有害的

大多数好的设计者象躲避瘟疫一样来避免使用实现继承(extends 关系).实际上80%的代码应该完全用interfaces写,而不是通过extends."Java设计模式"一书详细阐述了怎样用接口继承代替实现继承.这篇文章描述设计者为什么会这么作. Extends是有害的:也许对于Charles Manson这个级别的不是,但是足够糟糕的它应该在任何可能的时候被避开."JAVA设计模式"一书花了很大的部分讨论用interface继承代替实现继承. 好的设计者在他的代

Java语言入门教程(十二):Java语言中继承之基本概念

从教程(十)开始,已经从学习单个类的基本语法,转到了学习多个类之间 的关系.教程(十)中,学习了类与类长间的两种关系,关联和依赖.为了维护 1对多的关系,在教程(十一)中,学习了数组.除了关联和依赖,类与类还有 一种非常重要且常见的关系,就是继承.本文将介绍继承的概念.作用.使用场 景等. 假设有这样一个简单需求(其实谈不上是需求,仅仅为了初学者容易理解而 编造):某培训中心要开发一个内部员工管理系统.该培训中心目前有两个部门 ,技术资源部和业务部.技术资源部的员工负责讲课,称为讲师.业务部员工

Java 25天基础-DAY 07-面向对象-继承子父类中变量的特点-函数的另一个特性重写(覆盖)

继承: 1.提高了代码的复用性 2.让类与类之间产生了关系,有了这个关系,才有了多态的特性. 注意: 千万不要为了获取其他类的功能,简化代码而继承. 必须是类与类之间有所属关系才可以继承,所属关系is a(谁是谁的一种); java语言中,Java只支持单继承,不支持多继承. 因为多继承容易带来安全隐患:当多个父类中定义了相同的功能,当功能内容不同时,子类对象不确定要运行那一个. 但是Java保留了这种机制,并用另一种体现形式来完成表示,"多实现" Java支持的多层继承: 也就是一个