首页 > 代码库 > Effective C++ Item 39 明智而审慎地使用 private 继承

Effective C++ Item 39 明智而审慎地使用 private 继承

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie


经验:private 继承意味 is-implemented-in-terms of。它通常比 composition 的级别低。

但是当 derived class 需要访问 protected base class 的成员,或需要重新定义继承而来的 virtual 函数时,这么设计是合理的


经验:和 composition 不同, private 继承可以造成 empty base 最优化。这对致力于“对象尺寸最小化”的程序库开发者而言,可能很重要
示例1:虽是 Empty class,但却不仅要花费一个 char 空间,还可能因为对齐的需要而花费更多的空间
class Empty{}; //这种 class 不带任何数据,没有 non-static 成员变量,没有 virtual 函数(因为这种函数的存在会为每个对象带来一个 vptr, Item 7),
			   //也没有 virtual base classes (因为这样的 base classes 也会招致何种上的额外开销, Item 40)

class HoldsAnInt{
private:
	int x;
	Empty e;
};


int main(){
	cout << sizeof(Empty) << " " << sizeof(HoldsAnInt) << endl;//32位机器输出:1 8 
	return 0;
}

解析:
C++会安插一个char到空对象内
对齐:一个类型的大小要能整除其地址值。


示例2:EBO,Empty class 不会花费额外空间
class HoldsAnInt : private Empty{
private:
	int x;
} ;

int main(){
	cout << sizeof(Empty) << " " << sizeof(HoldsAnInt) << endl;//32位机器输出:1 4
	return 0;
}

解析:EBO(empty base optimization;空白基类最优化)。EBO只能用于单继承,不能用在多继承中。
现实中的"empty" classes并不真的是 empty。虽然它们从未拥有 non-static 成员变量,却往往内含 typedefs, enums, static 成员变量,或 non-virtual 函数。
STL就有许多技术用途的 empty classes.