C++面向对象机制
文章平均质量分 76
此专栏是2014年已出版著作《编码的法则:C++程序员不可不知的101条实用经验》第三篇连载,第三篇C++面向对象机制 :包括11、12两章。内容涵盖C++继承和多态,模板和泛型,这些是C++面向对象的灵魂所在。
@一鸣惊人
一名软件开发老兵
展开
-
实用经验 92 区分函数模版与模版函数,类模版和模板类
模板就是实现代码重用机制的一种工具,它可实现类型参数化,即把类型定义为参数, 从而实现了代码的可重用性。模版可以分为两类,一个是函数模版,另外一个是类模版。在使用模板概念时,经常会遇到这4个概念:函数模板,模板函数,类模板,模板类。这4个概念非常类似,也经常被我们所误用,本使用经验将主要讲述他们的差异。原创 2021-11-11 23:33:06 · 1650 阅读 · 0 评论 -
实用经验 91 区分继承、模版还有组合
区分模板和继承,当对象的类型不影响类中函数的行为时,选择使用模板,当对象的类型影响类中函数的行为时,选择继承而不选择模板。区别继承和组合,如果对象关系是is kind of 关系时选择继承,如果是a part of关系时选择组合。原创 2021-10-21 23:25:08 · 230 阅读 · 0 评论 -
实用经验 90 将模版的声明和定义放到同一个文件
模板是多态的静态实现方式,模板可以最大限度降低同质冗余代码,增加代码的维护性。模板实现有三种方法,声明和实现在同一个头文件中;声明和实现分离,包含头文件;使用export实现分离。但是在这三种实现方式中,声明和实现在同一个头文件中,是最优实现方式。原创 2021-10-20 19:29:11 · 241 阅读 · 0 评论 -
第12章 模版和泛型
你设计的两个类,除了成员变量数据类型之外,其他所有操作和实现完全相同。这些问题都可通过模板和泛型解决。面向对象所依赖的多态是运行时的多态,而泛型模板所依赖的多态是编译时的多态或参数式多态。本章就来讨论模板和泛型,也许这些议题无法保证你成为模板编程的专家,但却有可能使你会成模板编程的高手。原创 2021-10-19 23:45:24 · 142 阅读 · 0 评论 -
实用经验 89 关于虚赋值的问题
将重载赋值运算符实现声明为virtual函数,称为虚赋值。赋值运算符声明为虚函数是合法的,但是虚赋值却不合理。尽量避免使用虚复制,而通过原型模式替代实现对象的复制拷贝。原创 2021-10-19 23:19:44 · 229 阅读 · 0 评论 -
实用经验 88 虚函数重载的陷阱
如果你的项目不支持C++1,不要试图尝试重载虚函数,你会为此付出代价的,如果你的项目支持C++11,那另当别论。原创 2021-10-19 23:06:31 · 372 阅读 · 0 评论 -
实用经验 87 切记继承过度滥用
在设计过程中,过广或过深的继承都不是良好设计。类型职责划分不清楚是造成这种继承主要原因。对继承滥用保持警惕,同时警惕常理逻辑在软件设计中的负面影响。对于“指数级”继承膨胀问题,我们应需寻找合适的解决方案,以防类似问题继续蔓延原创 2021-10-06 10:01:16 · 453 阅读 · 0 评论 -
实用经验 86 绝对不要重新定义继承而来的缺省参数
绝对不要重新定义继承而来的缺省参数,采用NVI方案:令基类的一个public non-virtual函数调用一个private virtual函数,后者可被派生类重新定义。可让non-virtual函数指定缺省参数,而private virtual函数负责真正实现工作。采用NVI这种方式,用户可采用静态的方式从基类类型的接口取得参数默认值,而派生类也可自由的变更函数的行为,而不用担心什么缺省初始化物了。原创 2021-10-01 08:42:22 · 163 阅读 · 0 评论 -
实用经验 85 不要重新定义继承而来的非虚函数
重定义继承而来的非虚函数导致的最明显的现象就是函数覆盖。任何情况下都要禁止重新定义继承而来的非虚函数。以防产生函数覆盖现象。原创 2021-09-30 22:24:46 · 321 阅读 · 0 评论 -
实用经验 84 区分接口继承和实现继承
无论是接口继承还是实现继承,都是public继承的范畴。public继承可分为两部分:接口继承和实现继承。同一种public继承方式,在不同代码环境中表现出不同的特性。这蕴含了深刻的面向对象设计理解和实现机制。通过本博客的学习你会掌握接口继承和实现继承的差异性。原创 2021-09-13 21:56:48 · 863 阅读 · 0 评论 -
实用经验 83 确保public继承是“is-a”关系
public 继承意味着“is-a”。任何使用基类Base的地方都可以被派生类Derived完全替换,因为每一个Derived Object 都是一个 Base Object。在public继承设计中,我们需要考虑常识,同时也要兼顾is-a的客观概念。只有这样设计出的继承和多态才能满足实际编程的需要。原创 2021-09-11 00:13:15 · 266 阅读 · 0 评论 -
实用经验 82 区分overloading、overriding、hiding的差异
OOP存在重载(overloading)、重写(overriding)、隐藏(hiding)3个概念。他们非常相似,也容易混淆。三者的差异可从作用域,函数名,参数,返回值,有无virtual等方面来理解。原创 2021-09-09 23:15:44 · 283 阅读 · 0 评论 -
实用经验 81 谨慎的使用private继承
public继承可视为is-a关系。私有继承仅展示的是Drived依靠Base而实现这种概念,除此之外别无其他了。private继承意味只有实现部分被继承, 接口部分应略去。如果classes之间的继承关系是private,编译器不会自动将一个Derived 对象转换为一个Base对象,而pubic展示的是Drived是一种Base。原创 2021-09-08 19:48:27 · 150 阅读 · 0 评论 -
实用经验 80 理解派生类构造/析构运行原理
对象的构造和析构扮演着对象创建和释放的角色。如同现实世界中的其他事物一样,对象同样有自己的创建顺序和释放流程,尤其在存在继承和虚继承的对象体系中,对象的构造和析构更显得尤为重要。对象构造析构遵循规则如下:派生类构造,先构造所有基类(基类构造的顺序为其声明的顺序),然后才构造当前派生类;派生类如存在成员对象,成员对象会先被构造,然后才运行构造函数构造当前派生类原创 2021-09-04 11:03:06 · 199 阅读 · 0 评论 -
实用经验 79 提防对象切片
如果一个派生类对象向上强制转化为基类,用的是传值的方式,而不是指针和引用,那么,这个派生类对象在向上转化后,将会被切分成基类对象,也就是说,派生类中独有的成员变量和方法都被切分掉了,只剩下和基类相同的成员变量和属性。这个派生类对象被切成了一个基类对象。这就是对象切片问题,本文将详细讲述对象切片的相关陷阱。原创 2021-09-01 19:50:28 · 152 阅读 · 0 评论 -
实用经验 78 谨慎的使用多继承
多继承一直是OOP世界一个敏感而备受争议的话题。在先进OOP语言的大世界中,仅有C++和Eiffel坚持支持多继承机制,其他的基本上都持反对的态度。拥护者认为多继承更能自然的塑造世界,而反对者认为多继承不仅效率低下,而且存在单继承不存在的复杂性问题。但是多继承不会给程序带来多大好处,反而会增加无尽的复杂度和维护的高难度。所以除非有必要,一般不推荐使用多继承。原创 2021-08-30 20:46:56 · 201 阅读 · 0 评论 -
实用经验 77 明晰public,protected,private三种继承差别
继承是C++中实现多态的重要方法,通过继承机制,可利用已有的数据类型来定义新的数据类型。所定义的新的类类型不仅拥有新定义的成员,而且还同时拥有旧的成员。C++支持public,protected和private三种继承方式,请明确知道3者的区别和可见性。除非必要请不要实现多继承。多继承的强制类型转换会导致对象切片问题。原创 2021-08-27 23:03:48 · 743 阅读 · 0 评论 -
实用经验 76 基类析构函数应声明为virtual函数
构造函数实现类对象的创建,析构函数完成对象删除时资源释放。两者成对出现,每个自定义类数据类型,都必须定义构造函数和析构函数。当定义对象时,类的构造函数会由编译默认调用,同样对象释放时,对象的析构函数由编译器默认调用,实现对象释放。但是多态情况下,将基类的析构函数声明为virtual,可以防止部分析构问题, 将基类的析构函数定义为纯虚函数,需保证此纯虚函数包含实现,以防在析构时抛出异常。原创 2021-08-24 21:04:27 · 552 阅读 · 0 评论 -
第11章 继承和多态
继承和多态是面向对象编程的基础。面向对象编程的关键思想是多态,而多态最基本的使用实现机制就是继承机制。本章的主题是继承和多态,他们是C++语言面向对象的灵魂所在。通过本章内容的学校,可帮助读者对继承和多态有一个更加深刻的认识。原创 2021-08-22 22:10:48 · 127 阅读 · 0 评论