你所不知的private继承

上一篇 / 下一篇  2012-10-25 09:34:13 / 个人分类:C++

51Testing软件测试网 {9Z9r^.KZ"NG

  在C++的类中有许多种继承方式,而我们在软件设计和编写代码时用得最多的就是public继承,我们很少接触到private继承。但是我们 在设计时真的有思考过什么时候应该用public继承,什么时候不该使用public继承,什么时候应该想想那些经常被我们遗忘的知识,让我们从它们被遗 忘的角落里重拾它的光芒。例如private继承。51Testing软件测试网2W7E(T-|[ P B2H

51Testing软件测试网@o'BU+_]m

  As we all know,public继承是塑模出一种is-a关系。什么是is-a的关系呢?Effective C++这样描述:如果你令class D以public形继承class B,那么每一个类型为D的对象同时也是一个类型为B的对象,反之不成立。意思是B比D表现出更一般化的概念,而D比B表现出更特殊化的概念。你主张“B对 象可派上用场的地方,D对象一样可以派上用场”,因为每一个D对象都是一种(是一个)B对象。反之如果你需要一个D对象,B对象无法效劳。

!Ms { VPmq0

,j2}Y2@8v7q;kg"{5m0  还有就是我们喜欢用的virtual函数,即运行动态也是建立在public继承之上的。51Testing软件测试网8y$t \!l2Tb,i

51Testing软件测试网Qns4B q

  在我刚学C++时,只知道private继承,使继承而来的成员(public成员和protected成员)都成为private,至于它有 没有什么更深一层的意义和作用就没有去思考了,只是理想当然地把它认为是不想这些成员被它的以后的子类继承。那private继承到底意味着什么呢?

{Me)]o e(A(o#`Os!f0

)[P(r,lG3P(^ @ ?XG,B0  先看看下面的代码:

H}6Kw_^b Y0 51Testing软件测试网a mH"bX@

51Testing软件测试网!q7Bl%D v!R*V8Y

class Person{...};51Testing软件测试网#[3bGm-Zy
class Student:private Person{...};51Testing软件测试网5_u&_ @g mf6r)B E-y
void eat(const Person &p);51Testing软件测试网7R2VW(u8Y:dy
Person p;51Testing软件测试网k;Y*|+}*Qb x
Student s;
H ur*Ix0eat(p);//正确51Testing软件测试网 Kq3V!XQ
eat(s);//错误
51Testing软件测试网 D kko4e7~J,V

  再看看Effective C++的说法:51Testing软件测试网+}1L?,y K6wt

dj!B_*D5IBp+P"S0  如果classes之间的继承关系是private,编译器不会自动将一个deirved class对象转换为一个base class对象。

iM8K d%^8q.nD s0

/l#]Z5y!L[hp"t`0  private继承意味着implemented-in-terms-of(根据某物实现出)。如果你让class D以private继承class B,你的用意是为了采用class B内已经备妥的某些特性,不是因为B对象和D对象存在有任何观念上的关系。private继承纯粹是一种实现技术,意味着只有实现部分被继承,接口部分应 该略去。如果D以private形式继承B,意思是D对象根据B对象实现而得,private继承在软件设计层面上没有意义,其意义只及于软件实现层面。51Testing软件测试网s$C5G#MhI#EA

6~+U:Q2DN)R } x0  private有点has-a的感觉。它的意义与复合的意义相同。那我们的问题又产生了,什么时候用复合什么时候用private继承?答案很简单,尽可能使用复合。除了以下的2种情况:

y;l)T&Dk,U|6N0 51Testing软件测试网1I4I!Z,HM

  1、private继承通常比复合的级别低。但是当derived class需要访问protected base class的成员,或需要重新定义继承而来的virtual函数时,就要用private继承。

\VC4Vr_-KQ0 51Testing软件测试网%P5ZL5R']/b UT

  2、private继承可以造成empty class最优化。51Testing软件测试网-s;GaZf?r#M9E{


TAG:

 

评分:0

我来说两句

Open Toolbar