C++面向对象编程之复合、委托和继承
1.复合,表示has a
template <typename T>
calss A{
protected:
B<T> c;
}
这里表示 A 里面有一个 B,A 可以调用 B 写好了的功能函数,B 里的东西可能更多更强大,A 只取其中一些用;
复合关系下的构造和析构:
1)构造是由内而外进行的,在上例中,A 的构造会先调用 B 的默认构造函数,再执行自己的。

2)析构是由外而内进行的,在上例中,A 会先执行自己的,再执行 B 的析构函数。

当然,调用 B 的构造和析构都是编译器自动进行的,不用我们自己写,如果在构造 B 时不想使用默认构造就需要自己写哪个构造函数;
2.委托
大致描述就是 A 类里有个指针指向 B 类,在 A 需要的时候就可以调用 B;
需要注意的是,委托和复合里都是有一个其他类,但是他们的生命期是不一致的:
1)复合是 A 和 B 一起构造,生命是一起出现
2)委托是 A 在需要使用 B 时,B的生命才开始,并不同步

在上图的例子中,String 类只是作为对外的接口,它的实际实现都是在右边的 StringRep类 中,也就是说,右边怎么变都不会影响到左边,这种手法叫编译防火墙;
左下角这个reference counting 是一种共享手法,如果其中有一个要修改需要新开一个空间,其他的还是在共享;
3.继承,表示 is a
继承关系下的构造和析构(这个与复合其实差不多):
1)构造是由内而外,子类先调用父类的构造函数,在执行自己
2)析构是由外而内,之类先执行自己,再调用父类析构函数
*注意:父类的析构函数必须是virtual,要不然就不会有析构是由外而内,这个侯捷还没仔细解释,现在按我自己理解就是,父类用析构用virtual后,子类要写自己析构,编译器在调用析构时是会先执行自己的析构,所以才能由外而内;
C++面向对象编程之复合、委托和继承的更多相关文章
- JS面向对象编程之:封装、继承、多态
最近在实习公司写代码,被隔壁的哥们吐槽说,代码写的没有一点艺术.为了让我的代码多点艺术,我就重新温故了<javascript高级程序设计>(其中几章),然后又看了<javascrip ...
- C++面向对象编程之虚函数与多态和继承和复合下的构造和析构
1.对于非虚函数,是不希望派生类对该函数重新定义: 对于virtual函数,在父类已经有默认定义后,并希望子类重新定义它: 对于pure virtual函数,父类没有默认定义,派生类必须要重新定义它: ...
- python基础-面向对象编程之继承
面向对象编程之继承 继承的定义:是一种新建类的方式,新建的类称之为子类或派生类,被继承的父类称之为基类或超类 继承的作用:子类会""遗传"父类的属性,从而解决代码重用问题 ...
- 深入理解JavaScript系列(17):面向对象编程之概论
介绍 在本篇文章,我们考虑在ECMAScript中的面向对象编程的各个方面(虽然以前在许多文章中已经讨论过这个话题).我们将更多地从理论方面看这些问题. 特别是,我们会考虑对象的创建算法,对象(包括基 ...
- PHP面向对象编程之深入理解方法重载与方法覆盖(多态)
这篇文章主要介绍了PHP面向对象编程之深入理解方法重载与方法覆盖(多态)的相关资料,需要的朋友可以参考下: 什么是多态? 多态(Polymorphism)按字面的意思就是"多种状态" ...
- python基础-面向对象编程之多态
面向对象编程之多态以及继承.抽象类和鸭子类型三种表现形式 多态 定义:同一种类型的事物,不同的形态 作用: 多态也称之为"多态性".用于在不知道对象具体类型的情况下,统一对象调用方 ...
- python基础-面向对象编程之组合
面向对象编程之组合 定义:一个对象中拥有另一个或其他多个对象的属性和方法. 作用:减少代码的冗余,降低耦合度 关于耦合度的说明 耦合:通俗地讲,就是相互作用,相互影响的意思 耦合度越高,程序的可扩展性 ...
- EffectiveJava——复合优先于继承
继承时实现代码重用的重要手段,但它并非永远是完成这项工作的最佳工具,不恰当的使用会导致程序变得很脆弱,当然,在同一个程序员的控制下,使用继承会变的非常安全.想到了很有名的一句话,你永远不知道你的用户是 ...
- EffectiveJava(16)复合优先于继承
为什么复合优先于继承? 1.继承违反了封装原则,打破了封装性 2.继承会不必要的暴露API细节,称为隐患.比如通过直接访问底层使p.getProperty(K,V)的键值对可以不是String类型 3 ...
随机推荐
- Linux安装mysql8.0.29详细教程
我在上午卸载了陪伴我多年的mysql5.7,现在准备安装mysql8.0. 一.登录mysql官网下载mysql安装包(我的系统是Centos7) MySQL :: Download MySQL ...
- Vue 父组件传递给子组件,设置默认值为数组或者对象时
在vue 父子组件传参过程中,传递对象或者数组时,设置默认值为{}或者[] 错误写法: props: { pos: { type: [Object, Array], default: []//这是错误 ...
- JavaWeb--基本概念、Web服务器与Tomcat
前言 Java Web 其实就是一个技术的总和,把Web看成一个容器而已主要使用JavaEE技术来实现.在加上各种中间件. 整个javaWeb阶段的内容通过实际的案例贯穿学习, 所涉及到的技术知识点会 ...
- 当我们谈论算法我们在谈论什么:由疫情核酸检测想到的分治算法(Divide-and-Conquer)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_159 北京的疫情一波未平一波又起,由此看来,战"疫"将是一场旷日持久的战争,绝不能掉以轻心.轻易言胜.病毒随时 ...
- PerfView专题 (第五篇):如何寻找 C# 托管内存泄漏
一:背景 前几篇我们聊的都是 非托管内存泄漏,这一篇我们再看下如何用 PerfView 来排查 托管内存泄漏 ,其实 托管内存泄漏 比较好排查,尤其是用 WinDbg,毕竟C#是带有丰富的元数据,不像 ...
- [CF1498D] Bananas in a Microwave (DP)
题面&翻译 题解 虽然 m m m 很大,但是 n n n 很小,因此题目允许我们在 O ( n m ) O(nm) O(nm) 以内解决这道题. 定义一个 dp[i][j]=0/1 ? 如果 ...
- Java代码自动计算机
答案(这里面包括main方法不要写重了),copy即可使用: public static void main(String[] args) { while (true){ System.out.pri ...
- KingbaseES 自增列三种方式
KingbaseES中3种自增长类型sequence,serial,identity的区别: 对象 显示插入 显示插入后更新最大值 清空表后是否重置 是否跟事务一起回滚 多对象共享 支持重置 出现错误 ...
- Mac根据端口找进程id
lsof -i:20942 以后认真的学习一下这个命令
- Spring Boot2配置Swagger2生成API接口文档
一.Swagger2介绍 前后端分离开发模式中,api文档是最好的沟通方式. Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务. 及时性 (接 ...