C++面向对象编程<九>:面向对象-类之间的关系

OOP

面向对象:类与类之间的关系,分为三种:Inheritance(继承)、Composition(组合)、Delegation(委托)
**基于对象:单一类的封装

Composition组合,表示has-a关系

看一个栗子,如图此class里有(has-a)deque,常用图来表示类之间的关系。
这里写图片描述

上面这张图包含一种设计模式:Adapter(适配),含义如下:
已经有deque,但客户需要queue,而deque的功能完全能满足queue(只需要开放deque的一些接口即可),而queue就是一种Adapter.

  • composition下的构造与析构
    构造函数从内到外:如图:
    这里写图片描述

container的构造函数首先调用component的default构造函数(为什么调用默认构造函数呢?因为component可能有好几个构造函数,编译器不知道调用哪一个?因此只能调用默认构造函数,当然要想不调用默认构造函数,也可以自己写),然后才执行自己。

Container::Container(...) : Component() { ... }

**析构函数由外而内**container的析构函数首先执行自己,然后才执行component的析构函数。

Delegation(委托) (Composition by reference

见下图
这里写图片描述

  1. 左边has右边(has的是指针),右边是什么,左边其实不知道;左边的class和右边的class用指针相连,它们的生命周期不一致哦!
    Composition和Delegation虽然都是has-a关系,但还是有区别的。如下:Composition:外部和内部一起出现;Delegation:可能外部的先创建出来,等到需要右边的时候再创建出来,不同步。
  2. 这种写法非常有名:左边的class只是对外的接口,而右边的class来实现。叫做pimpl(pointer implementation)或handle/body(左边是句柄,右边是body)这个指针也可以指向不同的实现类,具有一种弹性,右边怎么变都不影响左边
  3. 有三个字符串都在用同一个hello,三个东西共享一个东西(共享当然很好,节省内存)。但a如果要改变hello不能影响b和c,当要改变内容时,单独拿一份给a来改,b和c来共享原来的东西。但是只有在更改时才给一份副本来写,这就是Copy on write

Inheritance继承,表示is-a

见下图
这里写图片描述
上面的图表示父类的数据是可以完整继承的,但这不是继承最有价值的部分,最有价值的是和虚函数的搭配使用。

  • 继承下的构造与析构
    子类的对象有父类的成分在里面,
    这里写图片描述
    构造由内而外
    Derived的构造函数首先调用Base的default构造函数,然后才执行自己
Derived::Derived(...) : Base() { ...};

析构由外而内
Derived的析构函数首先执行执行自己,然后才调用Base析构函数。

Derived::~Derived(...) { ... ~Base() };

base class的dtor必须是virtual,否则会出现undefined behavior
良好的编程习惯:base class的析构函数写成virtual

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值