C++改善程序与设计条例总结(七)

条款39:明智而审慎地使用private继承。尽可能使用复合关系,必要时使用private继承。

               (1)如果类之间的继承关系为private继承,编译器不会将子类对象转换为基类对象,这是区别public继承的一点;private继承的所有基类成员在子类中都会变成private属性,即使它们在基类中原本是protected或public属性;

               (2)private继承意味着is-implemented-in-terms of(根据某物实现出),这一关系和复合一样,它通常比复合的级别低。

              可以使用public继承和复合综合起来替换private继承达到程序改写,其好处是可以阻止虚函数在子类中重新定义,并且降低类文件的编译依存性。

             当子类需要访问基类的protected成员,或者为了重新定义一个或多个虚函数时,使用private继承是合理的。

             private继承区别复合一个重要点是,private继承可以造成空基类(empty base)所占空间最优化,这对于致力于“对象尺寸最小化”的程序库开发者而言,可能很重要。

 

条款40:明智而审慎地使用多重继承。多重继承比单一继承复杂,并且可能导致继承相同名称的新的歧义,以及对virtual继承的需要,请明智使用。

               (1)为了避免继承体系中对象成员的重复拷贝,可使用virtual 继承。对于virtual继承,其缺点是产生的对象体积相比non-virtual继承要大,而且对成员访问的速度慢,初始化情况更复杂(virtual bases classes 初始化由继承体系中的最底层class负责)。因此,非必要不使用virtual bases,平常请使用non-virtual继承,必须使用virtual base classes尽可能避免在其中放置数据,避免初始化赋值带来异常;

              (2)多重继承一个正当用途的场景,当涉及“public继承某个接口类(interface class)”和“private继承某个协助实现的class”的两相结合。

 

条款41:对于模板和泛型编程,了解隐士接口和编译期多态。classes和templates都支持接口和多态,两者区别如下:

              (1)对于classes而言,接口是显式的,以函数签名(签名包括函数名称,参数名称,返回类型)为中心,多态则是virtual函数根据对象的动态类型调用哪一个函数;

             (2)对于template参数而言,接口是隐式的,基于有效的表达式,多态则是在编译期以不同的templates参数具现化 function templates 和函数重载解析 会导致调用不同的函数。

 

条款42:了解typename的双重意义。

               (1)  对于声明templates类型参数,class和他typename的意义完全相同。templates内的名称分为三类,如果该名称依附于某个template参数,称为从属名称,如果从属名称在class内呈嵌套状,称之为嵌套从属名称,如果该名称并不依赖任何template参数的名称,称为非从属名称。

              (2)任何时候当template中涉及一个嵌套从属名称,可使用typenane进行标识,告诉编译器其类型,如 typename  C::const_iterator iter(container.begain()); 但是不适用于出现在base classes list 中的嵌套从属类型名称,也不能在成员初值列(member initialization list)作为 base class的修饰符。

 

条款43:学习处理模板化基类内的名称。当基类本身就是一个模板类时,编译器执行时如果模板基类没有具现化时,并不清楚该基类具体是什么,而且模板基类支持全特化,一旦模板参数被指定就不会发生变化,基类的全特化版本可能与一般的模板基类接口不一致,它可以拒绝继承模板化基类中的函数名称,这样在子类中进行函数调用,如果是特化基类,函数可能未定义,则无法编译。为此,有三种方式可以令c++“不进入 templatized base classes观察”的行为失效:

             (1)在基类函数调用动作之前加上this,如 this->sendclear(info);

             (2)使用using 声明式,让编译期不进入base class作用域查找,如 using MsgSendee<Company>::sendClear;

             (3)指明被调用的函数位于基类(base class)内,MsgSender<Company>::SendClear(info);

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值