Effective C++条款42: 明智地使用私有继承

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)。”

在赋值兼容规则中,公有继承时,有派生类对象可以赋给基类对象等规则。私有继承时,为什么不能将派生类对象转换成基类对象呢?

这里要抓住访问权限这个核心!

比如上面的例子,void dance(const Person& p);假如对象p调用了Person类里的public成员函数(这完全是允许的),而私有继承后,派生类对象是不允许调用该成员函数的(因为private继承后,基类public成员函数在派生类中已经变为private了)!所以私有继承时派生类对象不能转换为基类对象(如果允许,那么派生类对象就可以调用前述所说的那个在基类中的public成员函数了)。

 

从上面例子可以看出,private继承不是“是一个”的关系——例子明显说明学生不是一个人!

我理解,所谓“是一个”是指派生类对象能够访问基类对象可以访问的成员函数,即基类对象能干的事,派生类对象也能干。

posted @ 2013-05-28 10:52  helloweworld  阅读(169)  评论(0编辑  收藏  举报