面向对象的类关系及其C++实现
在面向对象的程序设计中,类之间有6中关系,分别是继承, 组合, 聚合,关联, 依赖,实现,如果使用C语言实现,上面的这些关系通过"结构体包含结构体、结构体包含结构体指针以及函数指针等语法实现",C语言本身的语法并不支持这些逻辑关系的实现,所以使用C语言实现面向对象的程序设计很多时候需要我们自己来关注某一种语法实现两个类之间到底是什么关系,但是C++/Java/Python等语言原生支持面向对象的程序设计,即这些编程语言的语法本身就可以实现这些类之间的逻辑关系,本文以C++为例,分析这些类关系的含义,下面是本文最终得到的UML类图示例。

继承(Generalization)
继承是面向对象的三大特征之一,是一种最能体现面向对象代码复用的类关系,对于继承,可以使用"is a"来表示,比如,小轿车(类B)"is a"车(类A),是对车(类A)的进一步刻画,那么这两个类就是"继承"关系。
class Goose : public Bird{
//子类扩展属性和方法
};
组合(Composition)
组合是将一个对象(部分)放到另一个对象里(组合)。它是一种 "has-a" 的关系。相比"聚合",组合是一种强所属关系,组合关系的两个对象往往具有相同的生命周期,被组合的对象是在组合对象创建的同时或者创建之后创建,在组合对象销毁之前销毁。一般来说被组合对象不能脱离组合对象独立存在,而且也只能属于一个组合对象。比如,鸟类和翅膀类就是组合关系,在创建一个鸟类对象时,一定要同时或之后创建一个翅膀类对象,销毁一个鸟类对象时,一定要先同时或之前销毁翅膀对象。
在C++语法中,使用在一个类中包含另外一个类类型的成员来实现组合。
class Wing{
};
class Bird{
Wing wing;
};
聚合(Aggregation)
聚合是一种弱所属关系,比如一只大雁和雁群,就是一种"聚合"关系。和组合相比,被聚合的对象可以属于多个聚合对象,比如,一只大雁可能属于多个雁群。
在C++语法中,通过类的指针来实现聚合
class Goose{
};
class Geese{
public:
Goose member[10];
};
关联(Association)
关联也是一种弱关系,但并不是从属关系,关联的连个的类可以看作是平等的,比如一只大雁和老鹰的关系,就可以看作关联关系
C++中,通过定义其他类指针类型的成员来实现关联,下面是双向关联的实现方法
class Egle{
class Goose *food;
};
class Goose{
class Egle *predator;
};
依赖(Dependency)
一个对象的某种行为依赖于另一个类,比如,大雁的迁徙行为受季节影响,那么,大雁和季节就会有"依赖"关系。
C++语法中,通过将一个类作为另一类方法的参数的形式实现两个类之间的依赖关系
class Season{
};
class Goose{
public:
void Migrate(Season season); //或Migrate(Season *season)、Migrate(Season &season)
};
实现(Realization)
实现对应的是面向对象中的"接口",即动物都要移动,但是每种移动的方式不一样,鸟要实现自己独有的移动的方法。
在C++中,接口通过的纯虚函数来实现,C++的多态就是通过虚函数来实现的。
class Animal{
public:
vitual void move();
};
class Bird: public Animal{
void move(){
//鸟的移动方式,飞
}
};
面向对象的类关系及其C++实现的更多相关文章
- Python面向对象02/类的空间问题、类与对象之间的关系、类与类之间的关系
Python面向对象02/类的空间问题.类与对象之间的关系.类与类之间的关系 目录 Python面向对象02/类的空间问题.类与对象之间的关系.类与类之间的关系 1. 类的空间问题 2. 类与对象之间 ...
- OC学习总结之面向对象和类
OC学习总结之面向对象和类 Objective-c是c语言的母集合,它的原意就是在原始的c语言的主体上加入面向对象的特性.1.面向对象和面向过程 面向对象和面向过程是编程的两种思考方式.面向对象 ...
- 设计模式基础:类及类关系的UML表示
设计模式基础:类及类关系的UML表示 2009-10-26 17:00 by 宗哥, 1891 阅读, 1 评论, 收藏, 编辑 UML中,类关系分为这几种,泛化(generalization), 实 ...
- 【转】Python之面向对象与类
[转]Python之面向对象与类 本节内容 面向对象的概念 类的封装 类的继承 类的多态 静态方法.类方法 和 属性方法 类的特殊成员方法 继承层级关系中子类的实例对象对属性的查找顺序问题 一.面向对 ...
- python进阶01 面向对象、类、实例、属性封装、实例方法
python进阶01 面向对象.类.实例.属性封装.实例方法 一.面向对象 1.什么是对象 #一切皆对象,可以简单地将“对象”理解为“某个东西” #“对象”之所以称之为对象,是因为它具有属于它自己的“ ...
- python 面向对象与类的基本知识
一 什么是面向对象,面向对象与类的关系. 面向对象的程序设计是用来解决扩展性. 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象 ...
- oop面向对象【类与对象、封装、构造方法】
今日内容 1.面向对象 2.类与对象 3.三大特征——封装 4.构造方法 教学目标 1.能够理解面向对象的思想 2.能够明确类与对象关系 3.能够掌握类的定义格式 4.能够掌握创建对象格式,并访问类中 ...
- 乐字节Java编程语言发展,面向对象和类
大家好,上次我们讲过了乐字节Java编程之方法.调用.重载.递归,接下来我们将会进入到Java封装的内容.Java编程语言发展,面向对象和类. 一.编程语言的发展 机器语言——直接由计算机的指令组成, ...
- 077 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 02 类和对象
077 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 02 类和对象 本文知识点:类和对象 说明:因为时间紧张,本人写博客过程中只是对知识点 ...
随机推荐
- c语言单片机中断服务程序
#include <reg52.h> #define uchar unsigned char #define uint unsigned int uint count; void dela ...
- JSAP103
JSAP103 1.节点 1)定义:不是元素,节点是页面中的所有内容(标签,属性,文本),Node.它使得任何标签中的元素获取都十分方便 2)节点的相关属性 可以使用标签即元素点出来,可以使用属性节点 ...
- F - 质数检测 V2
https://vjudge.net/contest/218366 Java解 import java.math.BigInteger; import java.util.Scanner; publi ...
- Deepin 15.4 更改为 阿里云源
自带的 软件包源 不好用,卡顿严重,准备替换它: 方式一:deepin linux 如何更新或者更换软件源(注意:好像不起作用) 方式二:[推荐]利用 阿里云 提供的镜像快速更换本地的 yum 源 ( ...
- js-工具函数
/** * 将文件大小转换成 ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],单位 * @param bytes * @returns */ ...
- mac的vscode配置使用zsh
配置文件 "terminal.integrated.shell.osx": "zsh"
- 前端学习-jQuery
老师博客:https://www.cnblogs.com/yuanchenqi/articles/6070667.html day43,day44 jquery 中文文档:http://jquery. ...
- js 的学习
day41 学习链接:https://www.cnblogs.com/yuanchenqi/articles/5980312.html 知识结构: BOM对象 DOM对象(DHTML) 一个完整的Ja ...
- “The subscription does not exist” when a distributor primary replica fails over to a replica that does not use the same agent profile
Symptoms Consider the following scenario: In Microsoft SQL Server 2017, you have a distribution agen ...
- 通过一个小Trick实现shader的像素识别/统计操作
2018/12/14日补充:后来发现compute shader里用AppendStructuredBuffer可以解决这类问题,请看这里:https://www.cnblogs.com/hont/p ...