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.

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

时间: 2024-10-30 07:51:14

Effective C++ Item 39 明智而审慎地使用 private 继承的相关文章

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

1. public继承表明is-a的关系,要求接口的完全继承,而private继承表明"根据某物实现出的关系",要求仅仅继承实现,private继承有两个规则: 1). 经由private继承而来的基类的所有成员在派生类中都会变成private属性 2). 由于1),编译器不允许将派生类转为基类以防止对派生类private成员的非法访问. 2. 由条款38,private继承和复合具有相同作用——"根据某物实现出".两者之间,要尽可能使用复合,除非必要情况.必要情况

Effective C++ -----条款39:明智而审慎地使用private继承

Private继承意味is-implemented-in-terms of(根据某物实现出).它通常比复合(composition)的级别低.但是当derived class需要访问protected base class的成员,或需要重新定义继承而来的virtual函数时,这么设计是合理的. 和复合(composition)不同,private继承可以造成empty base最优化.这对致力于“对象尺寸最小化”的程序库开发者而言,可能很重要.

Effective C++:条款39:明智而审慎地使用private继承

(一) (1)private继承意味着"依据某物实现出".仅仅有实现部分被继承.接口部分应略去: (2)它仅仅在软件"实现"层面上有意义,在软件"设计"层面上没有意义. (3)private继承而来的基类成员都会在派生类中成为private属性,纵使它们在base class中原本是protected或public属性: (4)假设类之间是private继承关系.编译器不会自己主动将一个派生类对象转换为基类对象. (5)D类以私有形式继承B类,意

Effective C++ Item 40 明智而审慎地使用多重继承

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:多重继承比单一继承复杂.它可能导致新的歧义性,以及对 virtual 继承的须要 演示样例: class BorrowableItem{ public: void checkOut(); }; class ElectronicGadget{ private: bool checkOut() const; }; class MP3Player: public BorrowableIte

条款39:明智而审慎地使用private继承(use private inheritance judiciously)

NOTE: 1.private 继承意味 is-implemented-in-terms-of(根据某物实现出).它通常比复合(composition)的级别低.但是当derivated class需要访问protected base class的 成员,或需要重新定义继承而来的virtual函数时,这么设计是合理的. 2.和复合(composition)不同,private 继承可以造成empty base 最优化.这对致力于“对象尺寸最小化”的程度开发者而言,可能很重要.

明智而审慎的使用private继承

private继承的意义在于“be implemented in turns of”. private继承与public继承时完全不同的,主要体现在两个地方 其一,public继承在子类中保持父类的访问权限,即父类中是public的成员函数或者成员便变量可,在子类中仍是public,对private或protected 的成员函数或成员变量亦是如此:但private继承则不是这样的,他破坏了父类红的访问权限标定,将之转成为private,这对子类本省并无影响,但却影响了子类的子类,子类的子类将无

Effective JavaScript Item 39 绝不要重用父类型中的属性名

本系列作为Effective JavaScript的读书笔记. 如果需要向Item 38中的Actor对象添加一个ID信息: function Actor(scene, x, y) { this.scene = scene; this.x = x; this.y = y; this.id = ++Actor.nextID; scene.register(this); } Actor.nextID = 0; 同时,也需要向Actor的子类型Alien中添加ID信息: function Alien(

Effective C++:条款40:明智而审慎地使用多重继承

(一) 慎用多重继承,因为那样的话可能会造成歧义.. <pre name="code" class="cpp">class BorrowableItem { public: void checkOut(); }; class ElectronicGadet { private: bool checkOut() const; }; class MP3Player : public BorrowableItem <pre name="code

读书笔记 effective c++ Item 54 让你自己熟悉包括TR1在内的标准库

1. C++0x的历史渊源 C++标准——也就是定义语言的文档和程序库——在1998被批准.在2003年,一个小的“修复bug”版本被发布.然而标准委员会仍然在继续他们的工作,一个“2.0版本”的C++标准预计在2009年被发布(虽然所有的工作很有可能在2007年底被完成).直到现在,发布下一版C++的预计年份还没有被确定,这就解释了为什么人们把下一版C++叫做“C++0x”——C++的200x年版本. C++0x可能会包含一些有趣的新的语言特性,但是大多数新C++功能将会以标准库附加物的形式被