代码改变世界

Effective C++ 学习笔记(25)

2011-08-07 18:14  Daniel Zheng  阅读(356)  评论(0编辑  收藏  举报

明智的使用私有继承


  C++将公有继承视为 "是一个" 的关系。例如:某个类层次结构中,Student 类从Person 类公有继承,为了使某个函数成功调用,编译器可以在必要时隐式地将Student 转换为Person。这个例子很值得再看一遍,只是现在,公有继承换成了私有继承:

  

class Person { ... };

class Student:private Person { ... }; // 使用私有继承

void dance(const Person& p); // 每个人会跳舞
void study(const Student& s); // 只有学生才学习

Person p;
// p 是一个人
Student s; // s 是一个学生

dance(p);
// 正确, p 是一个人
dance(s); // 错误!一个学生不是一个人

  很显然,私有继承的含义不是 "是一个",那它的含义是什么呢?

  "别忙!" 你说。"在弄清含义之前,让我们先看看行为。私有继承有那些行为特征呢?" 那好吧。关于私有继承的第一个规则正如你现在所看到的:和公有继承相反,如果两个类之间的继承关系为私有,编译器一般不会将派生类对象(如Student)转换成基类对象(如Person)。这就是上面的代码中为对象s调用dance 会失败的原因。第二个规则是,从私有基类继承而来的成员都成为了派生类的私有成员,即使它们在基类中是保护或公有成员。行为特征就这些。

  这为我们引出了私有继承的含义:私有继承意味着 "用...来实现"。如果使类D 私有继承于类B,这样做是因为你想利用类B 中已经存在的某些代码,而不是因为类型B 的对象和类型D 的对象之间有什么概念上的关系。

  因而,私有继承纯粹是一种实现技术。私有继承意味着只是继承实现,接口会被忽略。如果D 私有继承于B,就是说D 对象在实现中用到了B 对象,仅此而已。私有继承在软件 "设计" 过程中毫无意义,只是在软件 "实现" 时才有用。

  私有继承意味着 "用...来实现" 这一事实会给程序员带来一点混淆,因为"分层" 也具有相同的含义。怎么在二者之间进行选择呢?答案很简单:尽可能地使用分层,必须时才使用私有继承。

  以下摘自Google C++ Code Style:  所有继承必须是 public 的. 如果你想使用私有继承, 你应该替换成把基类的实例作为成员对象的方式(分层).