本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:多重继承比单一继承复杂.它可能导致新的歧义性,以及对 virtual 继承的须要 演示样例: class BorrowableItem{ public: void checkOut(); }; class ElectronicGadget{ private: bool checkOut() const; }; class MP3Player: public BorrowableIte…
多重继承比单一继承复杂.它可能导致新的歧义性,以及对virtual继承的需要. virtual继承会增加大小.速度.初始化(及赋值)复杂度等等成本.如果virtual base classes不带任何数据,将是最具实用价值的情况. 多重继承的确有正当用途.其中一个情节涉及“public继承某个Interface class"和”private继承某个协助实现的class“的两相组合.…
NOTE: 1.多重继承比单一继承复杂.它可能导致新的歧义性,以及对virtual继承的需要. 2.virtual 继承会增加大小 速度 初始化(及赋值)复杂度等等成本.如果virtual base class 不带任何数据,将是最具价值的情况. 3.多重继承的确有正当用途.其中一个情节涉及“public 继承某个interface class”和“private 继承某个协助实现的class”的两相组合.…
1. 多继承的两个阵营 当我们谈论到多继承(MI)的时候,C++委员会被分为两个基本阵营.一个阵营相信如果单继承是好的C++性质,那么多继承肯定会更好.另外一个阵营则争辩道单继承诚然是好的,但多继承太麻烦,而不值得去使用它.在这个条款中,我的主要目标是让你明白多继承的这两个观点. 2. 从多个基类中继承的名字不能相同 第一件事情是你需要认识到使用MI进行设计时,从多个基类中可能会继承相同的名字(例如函数或者typedef等等).这就会导致模棱两可的问题,例如: class BorrowableI…
多重继承是一种比较复杂的继承关系,它意味着如果用户想要使用这个类,那么就要对它的父类也了如指掌,所以在项目中会带来可读性的问题,一般我们都会尽量选择用单继承去替代它. 使用多重继承过程容易碰到的问题就是名字冲突,像下面这样: class Base1 { public: void fun(){} }; class Base2 { private: void fun(){} }; class Derived : public Base1, public Base2 {}; int main() {…
Use private inheritance judiciously. 如果classes之间的继承关系是private,编译器不会自动将一个derived class对象转换为一个base class对象.这和public继承的情况不同. 由private base class继承而来的所有成员,在derived class中都会变成private属性,纵使他们在base class中原本是protected或者public属性.…
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所以JDK 最好下载 JDK 9以上的版本. 52. 明智而审慎地使用重载 下面的程序是一个善意的尝试,根据Set.List或其他类型的集合对它进行分类: // Broken! - What does this program print? public class CollectionClassif…
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所以JDK 最好下载 JDK 9以上的版本. 53. 明智而审慎地使用可变参数 可变参数方法正式名称称为可变的参数数量方法『variable arity methods』 [JLS, 8.4.1],接受零个或多个指定类型的参数. 可变参数机制首先创建一个数组,其大小是在调用位置传递的参数数量,然后将参…
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所以JDK 最好下载 JDK 9以上的版本. 55. 明智而审慎地返回Optional 在Java 8之前,编写在特定情况下无法返回任何值的方法时,可以采用两种方法.要么抛出异常,要么返回null(假设返回类型是对象是引用类型).但这两种方法都不完美.应该为异常条件保留异常(条目 69),并且抛出异常…