条款三十九:明智而审慎的使用private继承
1.C++裁定凡是独立(非附属)对象都必须有非零大小。
class Empty{};//没有数据,所以其对象应该不使用任何内存 class HoldAnInt { private: int x; Empty e; } //你会发现sizeof(HoldAnInt)>sizeof(int);在大多数编译器中sizeof(Empty)获得1.但是还会有默认的内存对其操作。
2.空白基类最优化
class HoldAnInt:private Empty { private: int x; }//几乎可以确定sizeof(HoldsAnInt)==sizeof(int)
3.和上面的复合不同,private继承可以造成empty base最优化。这对致力于“对象尺寸最小化”的程序库开发者而言,可能很重要。
条款四十:明智而审慎地使用多重继承
条款四十一:了解隐式接口和编译期多态
1.面向对象世界总是以显式接口和运行期多态解决问题。
2.隐式接口不基于函数签名式,而是由有效表达式组成。
template<typename T> void doProcessing(T& w) { if(w.size()>10 && w!=someNastyWidget) //表达式 ..... }
3.对classes而言接口是显式的,以函数签名为中心。多态则是通过virtual函数发生于运行期。
4.对template参数而言,接口是隐式的,奠基于有效表达式。多态则是通过template具现化和函数重载解析发生于编译期。
条款四十二:了解typename的双重意义
1.任何时候当你想要在template中指涉一个嵌套从属类型名称,就必须在紧邻它的前一个位置放上关键字typename
template<typename C> void print2nd(const C&container) { if(container.size()>=2) { typename C::const_iterator iter(container.begin()); .... } }
2.声明template参数时,前缀关键字class和typename可互换。
3.请使用关键字typename标识嵌套从属类型名称;但不得在base class lists(基类列)或member initialization list(成员初值列)内以它作为base class 修饰符。
条款四十三:学习处理模板化基类内的名称
条款四十四:将于参数无关的代码抽离templates
条款四十五:运用成员函数模板接收所有兼容类型