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

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

  • 相关阅读:
    H5 标签属性、input属性
    使用Hexo搭建个人博客配置全过程
    vue iView 打包后 字体图标不显示
    webpack 打包后 Uncaught SyntaxError: Unexpected token <
    node 搭建本地服务器
    csf 课件转化为wmv正常格式
    css+background实现 图片宽高自适应,拉伸裁剪不变形
    PHP访问时Forbidden403错误
    jQuery事件对象
    JS获取当前时间实时显示
  • 原文地址:https://www.cnblogs.com/helloweworld/p/3103160.html
Copyright © 2011-2022 走看看