明智而审慎的使用private继承

来源:互联网 发布:淘宝代购化妆品真假 编辑:程序博客网 时间:2024/06/10 01:43

明智而审慎的使用private继承

下面是摘自《effective c++》3rd第条款39。

先说private继承的特点:1.也就是说,编译器不会讲一个private继承而来的派生类对象转化为一个基类对象。这意味着,priavte继承不再是is-a关系:

[cpp] view plaincopy
  1. class Person  
  2. {  
  3. protected:  
  4.     string name;  
  5. };  
  6.   
  7. class Student:private Person  
  8. {  
  9. private:  
  10.     string schoolNumber;  
  11. };  
  12.   
  13. void eat(const Person& p)  
  14. {  
  15.     cout<<"eat"<<endl;  
  16. }  
  17.   
  18. void study(const Student& s)  
  19. {  
  20.     cout<<"study"<<endl;  
  21. }  
  22.   
  23. int main()  
  24. {  
  25.     Person p1;  
  26.     eat(p1);  
  27.     Student s1;  
  28.     study(s1);  
  29. //  eat(s1);错误  
  30.     return 0;  
  31. }  
2.基类的public和protected成员在派生类中全为private属性。


因此,private继承意味着:根据某物实现。这与前面条款介绍的复合很类似。在大多数时候,我们应该使用复合,而不是private继承来实现这种功能。但是当有protected成员和虚函数牵扯进来的时候,我们又不得不用private继承。

其次,与复合相比,private可以使空基类的最优化。先看一个例子:

[cpp] view plaincopy
  1. //定义一个空基类  
  2. class Empty{};  
  3.   
  4. class HoldsAnInt  
  5. {  
  6. private:  
  7.     int x;  
  8.     Empty e;//复合  
  9. };  

在vs2010中,sizeof(int)为4,sizeof(Empty)为1,sizeof(HoldsAnInt)为8这似乎有悖于我们学过常理:首先,类的大小取决于其数据成员的大小。sizeof(Empty)应该为0,但是由于在编译器会将它的大小设为1,而“齐位需求”会将它放大为1个int,所以,izeof(HoldsAnInt)为8。但是,如果使用的是private继承来实现,就不存在这种问题了:sizeof(HoldsAnInt)只有一个int的大小:4.


总之,private继承意味着根据某物实现。当派生类需要访问基类的的受保护成员或者重新定义虚函数时,我们才使用它。而且private继承可以是得空基类最优化,如果在开发中需要是得对象尺寸最小,那么也用得着它。
原创粉丝点击