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继承不是“是一个”的关系——例子明显说明学生不是一个人!
我理解,所谓“是一个”是指派生类对象能够访问基类对象可以访问的成员函数,即基类对象能干的事,派生类对象也能干。