C++ / ACM 自学笔记 · v5.0

(五) 继承与组合

对象的成员和操作已经明确后,再面对两种关系:学生属于人的一种,学生同时拥有一份成绩记录。先分清需求,再选继承或组合。

继承用来表达“派生类型属于基类类型”,例如“圆形是一种图形”;组合用来表达“对象拥有某种成员”,例如“学生拥有成绩记录”。

继承表示类型关系组合表示拥有成员

图中 Student 属于 Person,ScoreRecord 则是 Student 的成员,两种箭头表示不同关系。

// 派生类先构造基类部分;protected 成员可由派生类访问。
#include <string>
using namespace std;

class Person {
  protected:
    string name_;

  public:
    explicit Person(string name) : name_(name) {}
};

// 成绩记录作为 Student 的成员,表示组合关系。
struct ScoreRecord {
    int value = 0;
};

class Student : public Person {
  private:
    ScoreRecord score_;

  public:
    Student(string name, int score) : Person(name), score_{score} {}
};

派生对象先构造基类部分,再构造成员,最后执行派生类构造函数体;析构时大体按相反顺序进行。基类的 private 成员仍存在于对象中,只是派生类不能直接访问。

对于新手,优先使用清晰的 public 继承关系;如果只是想复用一个容器或辅助对象,直接把它作为成员通常更容易理解。

查阅笔记正文与全部题解 · Ctrl / ⌘ K