第7章继承与派生 7.1类的继承与派生 72类的继承方式 7.3派生类的构造过程和析构过程 74多继承
第7章 继承与派生 7.1 类的继承与派生 7.2 类的继承方式 7.3 派生类的构造过程和析构过程 7.4 多继承
第7章继承与派生 ‖7.1类的继承与派生 71.1继承与派生的基本概念 在原有类的基础上派生出新的类,新类继承原有类的属性和 方法,称原有的类为基类,新类称为派生类。 人类: 姓名、性别、年龄、身高、体重 教师类: 姓名、性别、年龄、身高、体重、专业、职称 管理人员类 姓名、性别、年龄、身高、体重、职务 教师管理人员类:姓名、性别、年龄、身高、体重、专业、职称、职务 学生类: 姓名、性别、年龄、身高、体重、学号、班级、专业 间接基类 人类 直接基类教师类□管理人员类学生类单继承:派生类 只有一个基类 教师管理人员类多继承:派生类 有多个基类
7.1 类的继承与派生 7.1.1 继承与派生的基本概念 在原有类的基础上派生出新的类,新类继承原有类的属性和 方法,称原有的类为基类,新类称为派生类。 第7章 继承与派生 人类: 姓名、性别、年龄、身高、体重 教师类: 姓名、性别、年龄、身高、体重、专业、职称 管理人员类: 姓名、性别、年龄、身高、体重、职务 教师管理人员类: 姓名、性别、年龄、身高、体重、专业、职称、职务 学生类: 姓名、性别、年龄、身高、体重、学号、班级、专业 人类 教师类 管理人员类 学生类 教师管理人员类 多继承:派生类 有多个基类 单继承:派生类 只有一个基类 直接基类 间接基类
第7章继承与派生 ‖7.1类的继承与派生 71.2派生类的声明 单继承派生类的声明语法为: cass派生类名:继承方式基类名 派生类新增成员的声明 继承方式有三种( private, protected, public),在下一节中 详细介绍
7.1 类的继承与派生 7.1.2 派生类的声明 单继承派生类的声明语法为: class 派生类名 : 继承方式 基类名 { 派生类新增成员的声明; } 继承方式有三种(private,protected,public),在下一节中 详细介绍。 第7章 继承与派生
第7章继承与派生 例71定义一个位置坐标类,属性有x坐标和y坐标,成员函数 包括构造函数、获取X坐标的函数、获取y坐标的函数和移动位 置到新的坐标点函数。然后定义派生类点类,除了继承基类 (位置类)的成员外,又增加了新的数据成员颜色、获取颜色 值的成员函数和显示数据成员值的函数 include #include <string. h class CLocation∥位置坐标类 private int x int y; public CLocation(int X=0, int y=O) void Move To(int x, int y) int GetXo int Geto
例7.1 定义一个位置坐标类,属性有x坐标和y坐标,成员函数 包括构造函数、获取x坐标的函数、获取y坐标的函数和移动位 置到新的坐标点函数。然后定义派生类点类,除了继承基类 (位置类)的成员外,又增加了新的数据成员颜色、获取颜色 值的成员函数和显示数据成员值的函数。 #include #include class CLocation //位置坐标类 { private: int x; int y; public: CLocation(int x=0, int y=0); void MoveTo(int x, int y); int Getx(); int Gety(); }; 第7章 继承与派生
第7章继承与派生 例7.1(续一) CLocation: CLocation(int x, int y) CLocation:X=X;∥/可以写成this->X=x CLocation:y=y;∥可以写成this->y=y; void CLocation Move To(int x, int y) CLocation:X=x;∥可以写成this->x=x CLocation:y=y;∥可以写成this->y=y; int CLocation: Getxo 可通过域运算符(:)访问类中的 return x 成员x和y,与使用this指针有同样 作用 int CLocation Getyo return y;
例7.1 (续一) CLocation::CLocation(int x, int y) { CLocation::x = x; // 可以写成 this->x = x; CLocation::y = y; // 可以写成 this->y = y; } void CLocation::MoveTo(int x, int y) { CLocation::x = x; // 可以写成 this->x = x; CLocation::y = y; // 可以写成 this->y = y; } int CLocation::Getx() { return x; } int CLocation::Gety() { return y; } 可通过域运算符(::)访问类中的 成员x和y,与使用this指针有同样 作用 第7章 继承与派生
第7章继承与派生 例7.1(续 class CPoint: public CLocation∥从 LOcation中公有继承 private char Color[10] public CPoint(char*c) void setcolor(char *c) void showo CPoint:: C Point(char*c) strcpy( color, c) void CPoint: Setcolor(char *c) 调用从 CLocation类中继承来的成 员函数GeO和GetY(。 strcpy( color, c) void CPoint: Showo cout < Getxo <<, <<Gety( <<<< Color < endl
例7.1 (续二) class CPoint : public CLocation //从CLocation中公有继承 { private: char Color[10]; public: CPoint(char *c); void SetColor(char *c); void Show(); }; CPoint::CPoint(char *c) { strcpy(Color,c); } void CPoint::SetColor(char *c) { strcpy(Color,c); } void CPoint::Show() { cout << Getx() << "," << Gety() << " " << Color << endl ; } 第7章 继承与派生 调用从CLocation类中继承来的成 员函数GetX()和GetY()
第7章继承与派生 例71(续三) void main(void) 位置坐标通过 Location类构造函 数的默认参数值设置为(0,0) CPoint p( Red); p Showo p Move To(7, 8) p Showo p SetColor("Green") p Showo 程序运行结果为 0,0 Red 7,8 Red 7,8 Green 返回
例7.1 (续三) void main(void) { CPoint p("Red"); p.Show(); p.MoveTo(7,8); p.Show(); p.SetColor("Green"); p.Show(); } 位置坐标通过CLocation类构造函 数的默认参数值设置为(0,0) 程序运行结果为: 0,0 Red 7,8 Red 7,8 Green 第7章 继承与派生 返 回
第7章继承与派生 7.2类的继承方式 类成员的访问权限 私有成员( private):可以被类自身的成员和友元访问,但不能被包 括派生类在内的其他任何类和任何普通函数访问 公有成员( public):可以被任何普通函数和任何类的成员函数访问 保护成员( protected):可以被类自身的成员和友元访问外,还可以 被派生类的成员函数访问,但不能被任何非友元的普通函数访问 类的三种继承方式: 公有继承(pubc: 保护继承( protected): 私有继( private):
7.2 类的继承方式 类成员的访问权限: 私有成员(private):可以被类自身的成员和友元访问,但不能被包 括派生类在内的其他任何类和任何普通函数访问 公有成员(public):可以被任何普通函数和任何类的成员函数访问 保护成员(protected):可以被类自身的成员和友元访问外,还可以 被派生类的成员函数访问,但不能被任何非友元的普通函数访问 类的三种继承方式: 公有继承(public): 保护继承(protected): 私有继承(private): 第7章 继承与派生
第7章继承与派生 7.2类的继承方式 7.2.1公有继承 公有继承的特点: (1)基类的私有成员不能被派生类的函数成员访问 (2)基类的公有成员和保护成员在派生类中的访问权限不变 分析例7.1 基类 CLocation中的公有成员Getx()、Gety()和 MoveTo(),在派生类 C Point中的访问权限仍然是公有的。 而x,y是基类 CLocation的私有成员,在派生类 CPoint的成 员函数中不能访问。如果将 CPoint类的成员函数Show()改写成 下面的形式: void CPoint Showo cout <<x<<", <<y<<<<Color < endl 错误信息:“不能访问 CLocation类中 的私有成员x,y
7.2 类的继承方式 7.2.1 公有继承 公有继承的特点: (1) 基类的私有成员不能被派生类的函数成员访问 (2) 基类的公有成员和保护成员在派生类中的访问权限不变 分析例7.1 基类CLocation中的公有成员Getx()、Gety()和 MoveTo(),在派生类CPoint中的访问权限仍然是公有的。 而x,y是基类CLocation的私有成员,在派生类CPoint的成 员函数中不能访问。如果将CPoint类的成员函数Show()改写成 下面的形式: void CPoint::Show() { cout << x << "," << y << " " << Color << endl ; } 第7章 继承与派生 错误信息:“不能访问CLocation类中 的私有成员x,y
第7章继承与派生 7.2类的继承方式 7.2.1公有继承(续一) 若将基类 CLocation中的X,y改成保护成员,即 class clocation protected int x 将x,y改为保护成员后,上面的 showO Int y, 就可以直接访问成员x和y了 ublic int GetXo int Geto void Move To(int x, int y) CLocation(int X=0, int y=0)
7.2 类的继承方式 7.2.1 公有继承(续一) 若将基类CLocation中的x,y改成保护成员,即: class CLocation { protected: int x; int y; public: int Getx(); int Gety(); void MoveTo(int x, int y); CLocation(int x=0, int y=0); }; 第7章 继承与派生 将x,y改为保护成员后,上面的show() 就可以直接访问成员x和y了