• 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继承不是“是一个”的关系——例子明显说明学生不是一个人!

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

  • 相关阅读:
    封装
    魔术方法类与有关面向对象的关键字
    JS基础
    轮播效果
    进度条效果
    2018年6月
    2018年5月
    Monte Carlo tree search 学习
    2018年4月
    pachi 学习
  • 原文地址:https://www.cnblogs.com/helloweworld/p/3103160.html
Copyright © 2020-2023  润新知