(五) 继承与组合
对象的成员和操作已经明确后,再面对两种关系:学生属于人的一种,学生同时拥有一份成绩记录。先分清需求,再选继承或组合。
继承用来表达“派生类型属于基类类型”,例如“圆形是一种图形”;组合用来表达“对象拥有某种成员”,例如“学生拥有成绩记录”。
图中 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 继承关系;如果只是想复用一个容器或辅助对象,直接把它作为成员通常更容易理解。