博览网 c++课程 第三周 组合与继承

博览网 c++课程 第三周 组合与继承

  • 探讨类与类之间的关系

复合 Composition (has-a)

  • (自己的理解)一个类包含(有)另一个类的对象。注意UML类图,采用实心菱形,箭头指向包含的对象,菱形指向包含别人对象的类。
  • 适配器模式,一个类调用另外类已有的函数(接口),用来满足新类对接口和名称的要求。
  • 从内存的角度来解释复合,层层包含。
  • 构造函数之间的关系,container拥有component,外部的构造函数先调用内部的默认构造函数,即构造由内而外。container::container(...):compoent(){……}
  • 外部的析构函数先执行自己,再调用内部的析构函数,析构由外而内。container::~container(...):{……^compoent();}

委托关系(Delegation)按引用的复合

  • 一个类包含一个类的指针,UML类图使用空心的菱形代替复合中的实心菱形。Pimpl
  • 用指针相连,生命周期就不一致。
  • 例子中采用委托实现字符串的引用计数。copy on write

继承 (is-a)

  • 一个类从另一个类继承部分属性和方法。
  • uml类图,空心三角形指向父类。
  • 使用继承,传达一种信息,子类是一种(父类)
  • 继承跟虚函数搭配最有价值–重载。
  • 从内存的角度来看,子类的对象中有父类的成分。
  • 构造由内而外,derived的构造函数首先调用base的默认构造函数。Derived::Derived(...):Base(){....};
  • 析构由外而内,derived的析构函数先执行自己,然后才调用base的析构函数。Derived::~Derived(...){...~Base();};
  • 父类的析构函数必须是虚函数,否则会出现不可预期的情况。
  • 非虚函数,你不希望继承的类重新定义(覆盖override)它。
  • 虚函数,你希望继承类重新定义(覆盖)它,而且你对它已经有默认定义。
  • 纯虚函数,你希望继承类一定要重新定义它。virtual …… = 0;
  • 子类对象调用父类的函数,父类的函数中采用虚函数,再调用子类重载的函数。父类中将关键动作延缓到子类中来实现,这种函数的做法叫做Template method,在框架中大量使用。

继承加复合关系下的构造和析构

  • 子类从父类继承,子类还包含一个类的对象,构造函数先调用父类构造还是复合的对象?
  • 父类包含一个复合对象,子类继承。应该先调用复合构造,父类构造和子类构造。
  • 学习文件资源管理类中使用的 Composite 委托加继承的设计方法。
  • portotype 设计模式。现在创建未来的类。一个类包含一个静态对象,自身的对象,自己创造了自己。
  • 静态成员变量一定记住在类的外面进行定义。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值