您的位置:学习中国 推荐教程 C++C语言 正文
原作者:kuku 添加时间:2007-06-02 原文发表:2007-06-02 人气:19 来源:互联网

本文章共6149字,分4页,当前第4页,快速翻页:
 



但是也许你已经注意到我小心翼翼地说 "freestanding" objects(“独立”对象)必然不会有 zero size。这个约束不适用于 base class parts of derived class objects(派生类对象的基类构件),因为它们不是独立的。如果你用从 Empty 继承代替包含一个此类型的 object(对象),


class HoldsAnInt: private Empty {

private:

int x;

};

你几乎总是会发现 sizeof(HoldsAnInt) == sizeof(int)。这个东西以 empty base optimization (EBO)(空基优化)闻名,而且它已经被我测试过的所有编译器实现。如果你是一个空间敏感的客户的库开发者,EBO 就值得了解。同样值得了解的是 EBO 通常只在 single inheritance(单继承)下才可行。支配 C++ object layout(C++ 对象布局)的规则通常意味着 EBO 不适用于拥有多于一个 base(基)的 derived classes(派生类)。

在实践中,"empty" classes(“空”类)并不真的为空。虽然他们绝对不会有 non-static data members(非静态数据成员),但它们经常会包含 typedefs,enums(枚举),static data members(静态数据成员),或 non-virtual functions(非虚拟函数)。STL 有很多包含有用的 members(成员)(通常是 typedefs)的专门的 empty classes(空类),包括 base classes(基类)unary_function 和 binary_function,user-defined function objects(用户定义函数对象)通常从这些 classes(类)继承而来。感谢 EBO 的普遍实现,这样的继承很少增加 inheriting classes(继承来的类)的大小。

尽管如此,我们还是要回归基础。大多数 classes(类)不是空的,所以 EBO 很少会成为 private inheritance(私有继承)的一个合理的理由。此外,大多数 inheritance(继承)相当于 is-a,而这正是 public inheritance(公有继承)而非 private(私有)所做的事。composition(复合)和 private inheritance(私有继承)两者都意味着 is-implemented-in-terms-of(是根据……实现的),但是 composition(复合)更易于理解,所以你应该尽你所能使用它。

private inheritance(私有继承)更可能在以下情况中成为一种设计策略,当你要处理的两个 classes(类)不具有 is-a(是一个)的关系,而且其中的一个还需要访问另一个的 protected members(保护成员)或需要重定义一个或更多个它的 virtual functions(虚拟函数)。甚至在这种情况下,我们也看到 public inheritance 和 containment 的混合使用通常也能产生你想要的行为,虽然有更大的设计复杂度。谨慎使用 private inheritance(私有继承)意味着在使用它的时候,已经考虑过所有的可选方案,只有它才是你的软件中明确表示两个 classes(类)之间关系的最佳方法。

Things to Remember

·private inheritance(私有继承)意味着 is-implemented-in-terms of(是根据……实现的)。它通常比 composition(复合)更低级,但当一个 derived class(派生类)需要访问 protected base class members(保护基类成员)或需要重定义 inherited virtual functions(继承来的虚拟函数)时它就是合理的。

·与 composition(复合)不同,private inheritance(私有继承)能使 empty base optimization(空基优化)有效。这对于致力于最小化 object sizes(对象大小)的库开发者来说可能是很重要的。


 
本文章更多内容<<上一页 - 1 - 2 - 3 - 4
本页地址
相关文章

对象布局及多态实现之成员函数的调用
C++程序设计从零开始之语句
C++程序中导出Word文档简易方法
理解隐式接口和编译期多态
C++对象布局及多态之虚成员函数调用
如何访问模板化基类中的名字
对象布局及多态探索之菱形结构虚继承
C++之父Bjarne谈C++中的STL模板
C++箴言:用成员函数模板接受兼容类型
探索C++的秘密之详解extern C
C++编程人员容易犯的10个C#错误
C语言 编程实例

相关评论


本文章所属分类:首页 推荐教程 C++C语言   C++C语言