C++ 类之间的关系与实现

类与类的关系

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

1. 继承(Generalization)

又称为泛化。继承是面向对象的三大特征之一,是一种最能体现面向对象代码复用的类关系,对于继承,可以使用"is a"来表示,比如,小轿车(类B)"is a"车(类A),是对车(类A)的进一步刻画,那么这两个类就是"继承"关系。

class Goose : public Bird{
    //子类扩展属性和方法
};

继承(泛化)

2. 组合(Composition)

组合是将一个对象(部分)放到另一个对象里(组合)。它是一种 “has-a” 的关系。相比"聚合",组合是一种强所属关系,组合关系的两个对象往往具有相同的生命周期,被组合的对象是在组合对象创建的同时或者创建之后创建,在组合对象销毁之前销毁。一般来说被组合对象不能脱离组合对象独立存在,而且也只能属于一个组合对象。比如,鸟类和翅膀类就是组合关系,在创建一个鸟类对象时,一定要同时或之后创建一个翅膀类对象,销毁一个鸟类对象时,一定要先同时或之前销毁翅膀对象。

在C++语法中,使用在一个类中包含另外一个类类型的成员来实现组合。

class Wing{
};
class Bird{
    Wing wing;
};

3. 聚合(Aggregation)

聚合是一种弱所属关系,比如一只大雁和雁群,就是一种"聚合"关系。和组合相比,被聚合的对象可以属于多个聚合对象,比如,一只大雁可能属于多个雁群。
在C++语法中,通过类的指针来实现聚合

class Goose{
};
class Geese{
    public:
        Goose member[10];
};

4. 关联(Association)

一个类是另一个类的成员变量
关联也是一种弱关系,但并不是从属关系,关联的连个的类可以看作是平等的,比如一只大雁和老鹰的关系,就可以看作关联关系

C++中,通过定义其他类指针类型的成员来实现关联,下面是双向关联的实现方法

class Egle{
    class Goose *food;
};
class Goose{
    class Egle *predator;
};

如:汽车由引擎和发动机组成,实线线条:
关联
当创建类的对象时,如果该类具有内嵌对象成员,那么各个内嵌的对象将首先被自动创建。
因为部件对象是复杂对象的一部分,因此:

在创建对象时既要对本类的基本类型数据成员进行初始化,又要对内嵌成员进行初始化。

5. 依赖(Dependency)

一个类是另外一个类的函数参数或者函数返回值
一个对象的某种行为依赖于另一个类,比如,大雁的迁徙行为受季节影响,那么,大雁和季节就会有"依赖"关系。

C++语法中,通过将一个类作为另一类方法的参数的形式实现两个类之间的依赖关系

class Season{
}; 
class Goose{
    public:
       void Migrate(Season season); 
       //或Migrate(Season *season)、Migrate(Season &season)
};

如:
张三借车去上班,void goWork(Car * car){}
张三修理车,修理完后返回 Car* fixed(){}
虚线:
依赖

6. 实现(Realization)

实现对应的是面向对象中的"接口",即动物都要移动,但是每种移动的方式不一样,鸟要实现自己独有的移动的方法。

C++通过纯虚函数和纯虚类模拟一个接口,抽象类是一个接口类:定义一个抽象类,继承类对于抽象类进行实现。

class Animal{
    public:
        vitual void move();
};
class Bird: public Animal{
    void move(){
        //鸟的移动方式,飞
    }
};

实现

补充(增强类A的方法)

  1. 通过修改A的代码;
  2. 通过class B继承A,达到扩展的目的;
  3. 通过依赖,关联扩充A
    优先使用依赖,关联,不是继承

文章转载自:
C++之类和类之间的关系
面向对象的类关系及其C++实现

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值