C++ 组合 (Composition)

Posted 我是小白呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 组合 (Composition)相关的知识,希望对你有一定的参考价值。

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)的主要内容,如果未能解决你的问题,请参考以下文章

C++:关联、聚合和组合

使用Composition时如何避免子类回调?

UML的关联(Association), 聚合(Aggregation), 组合(Composition)区别

Vue2使用setuprefreactive等Vue3的组合式@vue/composition-apivuex-composition-helpers

在 uni-app 中使用 composition-api 组合API开发

类之间的关系详解:Aggregation(聚合)Composition(组合)Dependency(依赖)Generalization(泛化)Realization(实现)