• Effective C++ 学习笔记(25)


    明智的使用私有继承


      C++将公有继承视为 "是一个" 的关系。例如:某个类层次结构中,Student 类从Person 类公有继承,为了使某个函数成功调用,编译器可以在必要时隐式地将Student 转换为Person。这个例子很值得再看一遍,只是现在,公有继承换成了私有继承:

      

    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)。这就是上面的代码中为对象s调用dance 会失败的原因。第二个规则是,从私有基类继承而来的成员都成为了派生类的私有成员,即使它们在基类中是保护或公有成员。行为特征就这些。

      这为我们引出了私有继承的含义:私有继承意味着 "用...来实现"。如果使类D 私有继承于类B,这样做是因为你想利用类B 中已经存在的某些代码,而不是因为类型B 的对象和类型D 的对象之间有什么概念上的关系。

      因而,私有继承纯粹是一种实现技术。私有继承意味着只是继承实现,接口会被忽略。如果D 私有继承于B,就是说D 对象在实现中用到了B 对象,仅此而已。私有继承在软件 "设计" 过程中毫无意义,只是在软件 "实现" 时才有用。

      私有继承意味着 "用...来实现" 这一事实会给程序员带来一点混淆,因为"分层" 也具有相同的含义。怎么在二者之间进行选择呢?答案很简单:尽可能地使用分层,必须时才使用私有继承。

      以下摘自Google C++ Code Style:  所有继承必须是 public 的. 如果你想使用私有继承, 你应该替换成把基类的实例作为成员对象的方式(分层).

  • 相关阅读:
    bzoj 3438 小M的作物
    洛谷 1126 机器人搬重物
    hdu 4055 Number String
    顺序对齐
    codevs 1300 文件排版
    NOIP 2015 提高组 Day2
    poj 2484 A Funny Game
    51nod 1548 欧姆诺姆和糖果 (制约关系优化枚举)
    hdu 1907 John (anti—Nim)
    hdu 2516 取石子游戏 (斐波那契博弈)
  • 原文地址:https://www.cnblogs.com/DanielZheng/p/2130177.html
Copyright © 2020-2023  润新知