C++ 组合

  • 概述
  • 案例
  • 总结

概述

组合 (Composition) 指在一个类中另一类的对象作为数据成员.

案例

在平面上两点连成一条直线, 求直线的长度和直线中点的坐标.
要求:

  • 基类: Dot
  • 派生类: Line (同时组合)
  • 派生类 Line 从基类 Dot 继承的 Dot 数据, 存放直线的中点坐标
  • Line 类再增加两个 Dot 对象, 分别存放两个端点的坐标

Dot 类:

#ifndef PROJECT5_DOT_H
#define PROJECT5_DOT_H#include <iostream>
using namespace std;class Dot {
public:double x, y;Dot(double a, double b) : x(a), y(b) {};void show() {cout << "x: " << x << endl;cout << "y: " << y << endl;};
};#endif //PROJECT5_DOT_H

Line 类:

#ifndef PROJECT5_LINE_H
#define PROJECT5_LINE_H#include "Dot.h"class Line : public Dot {
private:Dot d1;Dot d2;
public:Line(const Dot &d1, const Dot &d2) : Dot(0, 0), d1(d1), d2(d2) {x = (d1.x + d2.x) / 2;y = (d1.y + d2.y) / 2;}void show(){Dot::show();cout << "dot1: (" << d1.x << ", " << d1.y << ")" << endl;cout << "dot2: (" << d2.x << ", " << d2.y << ")" << endl;}
};#endif //PROJECT5_LINE_H

main:

#include <iostream>
#include "Dot.h"
#include "Line.h"
using namespace std;int main() {double a, b;cout << "Input Dot1: \n";cin >> a >> b;Dot dot1(a,b);cout << "Input Dot2: \n";cin >> a >> b ;Dot dot2(a,b);Line l1(dot1, dot2);l1.show();return 0;
}

输出结果:

Input Dot1:
1 2
Input Dot2:
4, 6
x: 2.5
y: 1
dot1: (1, 2)
dot2: (4, 0)

总结

  • 类的组合和继承都是重用的重要方式, 可以有效地利用已有类的资源
  • 继承是纵向的, 组合是横向的. 通过继承, 我们从基类得到了数据成员. 通过组合, 从别的类得到了成员, 有效地组织和利用现有的类, 减少工作量
  • 如果类 A 和类 B 毫不相关, 不可以为了使 B 的功能更多些而让 B 继承 A 的功能
  • 如果类 B 有必要使用类 A 的功能. 当 B 是 A 的一种的时候我们使用继承, 当 B 是 A 的一部分时, 我们使用组合

C++ 组合 (Composition)相关推荐

  1. UML中聚集(Aggregation)与组合(Composition)的区别

    UML中,聚集和组成是两个十分相似的概念.书上这样说:聚集是关联中的一种,聚集对象由部分对象组成:组合又是一种特殊的聚集.在一个组合对象中,部分对象只能作为组成对象的一部分与组合对象同时存在. 即是说 ...

  2. UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)

    在UML类图中,常见的有以下几种关系: 泛化(Generalization),  实现(Realization),关联(Association),聚合(Aggregation),组合(Composit ...

  3. 详解:面向对象与面向过程的比较 类之间的关系:泛化、实现、依赖、关联、聚合、组合

    文章目录 1.面向对象程序设计概述 1.1 面向对象程序设计 1.2 传统结构化程序设计 1.3 面向对象与面向过程举例 2.类之间的关系 2.1 泛化/继承 2.2 实现 2.3 依赖 2.4 关联 ...

  4. java uml聚合代码_UML类图(下):关联、聚合、组合、依赖

    前言 上一篇文章UML类图(上):类.继承.实现,讲了UML类图中类.继承.实现三种关系及其在UML类图中的画法,本文将接着上文的内容,继续讲讲对象之间的其他几种关系,主要就是关联.聚合.组合.依赖, ...

  5. 谈一谈自己对依赖、关联、聚合和组合之间区别的理解

    在学习面向对象设计对象关系时,依赖.关联.聚合和组合这四种关系之间区别比较容易混淆.特别是后三种,仅仅是在语义上有所区别,所谓语义就是指上下文环境.特定情景等.他们在编程语言中的体现却是基本相同的,但 ...

  6. c++面向对象高级编程 学习五 组合、委托与继承

    组合 composition 表示has a queue类中有一个deque容器,这种关系叫做 组合 queue中的六个函数都是调用c的函数完成的 template <class T> c ...

  7. java对象组合_java并发编程(三): 对象的组合

    对象的组合: 如何将现有的线程安全组件,组合成我们想要的更大规模的程序. 设计线程安全的类: 设计线程安全类的三个要素: 1.找出构成对象状态的所有变量: 2.找出约束状态变量的不变性条件: 3.建立 ...

  8. composition java_阿里P7架构师通过源码浅析Java中的资源加载

    一. 前提 最近在做一个基础组件项目刚好需要用到JDK中的资源加载,这里说到的资源包括类文件和其他静态资源,刚好需要重新补充一下类加载器和资源加载的相关知识,整理成一篇文章. 二. 什么是类加载器 虚 ...

  9. 组合,聚合,关联,依赖的区别

    依赖(Dependency) 在C++中体现为局部变量.方法/函数的参数或者是对静态方法的调用 图示为: 关联(Association) 体现在C++中,关联关系是通过成员变量来实现的 图示为: 聚合 ...

  10. UML类图几种关系的总结,泛化 = 实现 组合 聚合 关联 依赖

    在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregation),组合(Compositi ...

最新文章

  1. 新的sublime text已经上传网盘,地址写在下面
  2. 2020秋季人工神经网络作业登记与批改
  3. 【C 语言】数组与指针操作 ( 数组符号 [] 与 指针 * 符号 的 联系 与 区别 | 数组符号 [] 与 指针 * 符号 使用效果 基本等价 | 数组首地址 与 指针 本质区别 )
  4. knn人脸识别判断_测试使用K-最近邻(kNN)算法的30个问题
  5. 手动脱UPX壳的几种方法
  6. JavaWeb --第四章Maven详解
  7. python 生成字符串_Python字符串生成器,按照特定的顺序
  8. Mybatis-Pagehelper
  9. canny边缘检测算法_OpenCV4中调用HED边缘检测算法
  10. ORA-04031:unable to allocate 4120 bytes of shared memory ‘obj stat mem’故障解决
  11. iTextSharp 添加表格
  12. audacity音轨加伴奏_如何在Audacity中使用Crossfade进行音轨之间的无缝过渡
  13. 开放api接口平台:appid、appkey、appsecret
  14. 【Java编程系列】java用POI、Itext生成并下载PPT、PDF文件
  15. 解决PHP项目显示“该网页无法正常运作”,但没有显示报错内容
  16. 雷锋网巴展见闻录:5G 手机也许会迟到,但不会缺席 | MWC 2019
  17. Mac OS 任意显示器 开启HiDPI方法
  18. max2 android9.0,乐视max2 安卓9.0刷机包
  19. 拼多多,京东,1688一键铺货到淘宝
  20. 【Oracle】TYPE定义的数据类型

热门文章

  1. OpenCV——SAD立体匹配
  2. 压缩照片大小——PPT实现
  3. docker容器端口映射
  4. shell中各种括号用法
  5. pe系统进服务器2008,怎么用U盘启动win server 2008 pe?
  6. ai画面怎么调大小_AI页面面板中如何调尺寸
  7. LaTeX种数学符号公式编写
  8. 国密(2)-- SM2签名和加密算法介绍
  9. 中位数技巧(推理+证明)
  10. java8 foreach 异常_在java 8流foreach中抛出异常