随笔 - 1760  文章 - 0  评论 - 109  阅读 - 431万

11.组合与继承

  • Inheritance(继承)
  • Composition(复合)
  • Delegation(委托)

像字符串类,复数类一把不会和其他类发生关联,但有的类可能需要和其它类发生关联,这就是面向对象的思想。

  • Composition(复合) ,表示has-a

注解:

  1. queue跟deque的关系就是复合关系,这就是has-a关系,表示‘我’里面有另外的东西。
  2. 联想C的结构(体),C的结构体里面可以有别的结构体,也可以由别的整型,浮点型,字符型对象,这也是has-a的关系。
  3. 所以,Composition表示一个类里面有其他类的实例(来自网友弹幕观点)。
  4. 其实queue是个容器,它容纳了另外一个东西:deque类的实例。

补全一点:

 注解:

  1. queue的public区域中6个功能完全利用deque的实例c来实现。
  2. 类复合的意义在于:A拥有B的实例,A的所有功能都利用B的实例来实现。
  3. 其实这是标准库中的例子。queue队列:先进先出,deque(double ended queue)队列:两端进出,显然后者功能更加强大。
  4. 最后一句,deque的pop_front()什么都没做,直接改装成了queue的pop()。
  5. 说不定queue里面的deque有100个功能,但是只开放了6个功能给queue.或者说queue只使用了deque里面的6个功能。
  6. 这种改造叫做Adapter(改造,适配)。把已有的类的功能改造成客户所需要的其它类的功能。
  7. 并不是所有的Composition都长这个样子哦,这只是一个特别的例子。
  • Composition(复合)关系下的构造和析构

构造由内而外

Container的构造函数首先调用Component的default构造函数,然后才执行自己。

 注解:

  1. 就像建造大楼一样,先建造里面,再建造外面。
  2. 红色的Component()表示先调用内部的构造函数(如果不符合自己的要求,则要自己写哦),{...}表示后做自己的事情。

析构由外而内

Container的析构函数首先执行自己,然后才调用Component的析构函数。

注解:

  1. 就像拆大楼一样,先拆外面,后拆里面。就像剥葱一样,先剥外面的,再剥里面的。
  2. {...}表示先做自己的事情,先执行自己的析构语句。
  •  Delegation(委托). Composition by reference(两个类通过引用(指针)复合)

 

 

 

 

注解:

  1. 左边仍然有一个右边的类的实例,但是这个“有”有点虚,不是那么扎实。只是有一个指向右边的类实例的指针,也可以说只是存储了另一个类的对象的首地址。这样的关系叫做Delegaion(委托)。
  2. 在任何一个时间点,我想做事情的时候我就可以调用。
  3. reference counting表示引用计数。a、b、c的内容都是Hello.
  4. 内容共享,共享的前提是内容要一样。
  5. 涉及到共享指针、写时复制、写时拷贝(copy on write)。
  • Inheritance(继承),表示is-a

 

 

注解:

  1. C++的继承方式有3种:public,private,protected,但是最重要的情况就是public.
  2. 继承的特点:人是一种动物,动物是一种生物。香蕉是一种水果。这些都是is-a的关系。
  3. 数据是可以完整的继承下来的。
  4. _List_node所创建的实例将拥有三个数据成员,自己的1个加上继承自_List_node_base的两个。这一点并不是继承这个语法最有价值的部分。最有价值的部分是虚函数概念。

 

注解:

  1. 子类的对象有父类的成分在里面。
  2. base class的dtor必须是virtual,否则会出现undefined behavior.

 构造有内而外(这样才坚固)

Derived的构造函数首先调用Base的default构造函数,然后才执行自己(...)。

 

 析构有外而内(这样也才坚固)

Derived的构造函数首先执行自己(...),然后才调用Base的析构函数。

 

posted on   一杯明月  阅读(296)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
历史上的今天:
2019-07-26 sort()函数中的key
2019-07-26 Python的私有变量与装饰器@property的用法
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示