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

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

  • 相关阅读:
    相机标定 和 单应性矩阵H
    全景视频拼接关键技术
    OpenCV图像变换(仿射变换与透视变换)
    用非数学语言讲解贝叶斯定理
    (二)SMO算法
    (一)SVM原理
    什么是赋范线性空间、内积空间,度量空间,希尔伯特空间
    决策树算法(五)——处理一些特殊的分类
    V8学习资源
    perforce 学习资源
  • 原文地址:https://www.cnblogs.com/helloweworld/p/3103160.html
Copyright © 2011-2022 走看看