第7章继承与派生 7.2类的继承方式 7.2.1公有继承(续二) 分析例7.1 C Point类的部分成员属性: C Point类的成员函数不能访问的成员有: int X; ∥继承基类的私有成员,类的成员函数不可访问 y ∥继承基类的私有成员,类的成员函数不可访问 C Point类的私有成员有: char Color[10] ∥己定义的私有成员 C Point类的公有成员有 int Getxo: ∥继承基类的公有成员,仍然是公有成员 nt Gety (; ∥继承基类的公有成员,仍然是公有成员 oid Move To(int x, int y):/继承基类的公有成员,仍然是公有成员 void setcolor(( char *c);∥自己定义的公有成员 void Showo ∥己定义的公有成员
7.2 类的继承方式 7.2.1 公有继承(续二) 分析例7.1CPoint类的部分成员属性: CPoint类的成员函数不能访问的成员有: int x; //继承基类的私有成员,类的成员函数不可访问 int y; //继承基类的私有成员,类的成员函数不可访问 CPoint类的私有成员有: char Color[10]; //自己定义的私有成员 CPoint类的公有成员有: int Getx(); //继承基类的公有成员,仍然是公有成员 int Gety(); //继承基类的公有成员,仍然是公有成员 void MoveTo(int x, int y); //继承基类的公有成员,仍然是公有成员 void SetColor(char *c); //自己定义的公有成员 void Show(); //自己定义的公有成员 第7章 继承与派生
第7章继承与派生 17 7.2类的继承方式 22保护继承 保护继承的特点: (1)基类的私有成员不能被派生类的函数成员访问 2)基类的公有成员和保护成员在派生类中的访问权限变为保 护类型 例7.2将例7.1的继承方式改为保护继承,其他代码保持不变 class cPoint protected CLocation rivate char color[10 public CPoint(char*c) void Setcolor(char *c) void Showo
7.2 类的继承方式 7.2.2 保护继承 保护继承的特点: (1) 基类的私有成员不能被派生类的函数成员访问 (2) 基类的公有成员和保护成员在派生类中的访问权限变为保 护类型 例7.2 将例7.1的继承方式改为保护继承,其他代码保持不变 class CPoint : protected CLocation { private: char Color[10]; public: CPoint(char *c); void SetColor(char *c); void Show(); }; 第7章 继承与派生
第7章继承与派生 7.2类的继承方式 7.2.2保护继承(续一) 改为保护继承后,主函数不变编译时,是否正确? yoid main(void) CPoint p(Red") p Showo 错误:不能在主函数中访问 CLocation 类的函数 MoveTo(,只能在派生类的 p Move To(7, 8) 成员函数中访问 p Showo p SetColor("Green ") p Showo
7.2 类的继承方式 7.2.2 保护继承(续一) 改为保护继承后,主函数不变编译时,是否正确? void main(void) { CPoint p("Red"); p.Show(); p.MoveTo(7,8); p.Show(); p.SetColor("Green"); p.Show(); } 第7章 继承与派生 错误:不能在主函数中访问CLocation 类的函数MoveTo(),只能在派生类的 成员函数中访问
第7章继承与派生 7.2类的继承方式 7.2.2保护继承(续二) 为实现点的移动,可在 C Point类中再添加一个公有成员函数 MoveTo(),如下: class CPoint: protected CLocation private char Color[10 public CPoint(char*c) void SetColor(char*c) void Showo 用基类名和域运算符(∷)可以 void MoveTo(intx, int y); 访问基类的成员函数 MoveTo 若不加限定,由于基类和派生类 t void CPoint: Move To(int x, int y) 都有成员函数 MoveTo(,将优先 调用派生类本身的同名成员函数 MoveTo CLocation:: Move To(x,y);
7.2 类的继承方式 7.2.2 保护继承(续二) 为实现点的移动,可在CPoint类中再添加一个公有成员函数 MoveTo(),如下: class CPoint:protected CLocation { private: char Color[10]; public: CPoint(char *c); void SetColor(char *c); void Show(); void MoveTo(int x, int y); }; void CPoint::MoveTo(int x, int y) { CLocation::MoveTo(x,y); } 第7章 继承与派生 用基类名和域运算符(::)可以 访问基类的成员函数MoveTo(), 若不加限定,由于基类和派生类 都有成员函数MoveTo(),将优先 调用派生类本身的同名成员函数 MoveTo()
第7章继承与派生 7.2类的继承方式 72.2保护继承(续三) 标识符的作用范围:成员函数作用域(如函数内部定义的局 部变量及函数参数),类或者派生类作用域(如类中定义的数据 成员或成员函数),基类作用域(如基类中定义的数据成员或成 员函数),全局作用域(如定义的全局变量,及全局函数,即普 通函数) 标识符的访问原则:如果在某一程序段中有一个以上的同名 标识符都有效,则标识符的作用范围越小,被访问到的优先级越 高 如果希望访问作用范围更大的标识符,则可以用类名和作用 域运算符进行限定。如: CLocation: Move To(xy)
7.2 类的继承方式 7.2.2 保护继承(续三) 标识符的作用范围:成员函数作用域(如函数内部定义的局 部变量及函数参数),类或者派生类作用域(如类中定义的数据 成员或成员函数),基类作用域(如基类中定义的数据成员或成 员函数),全局作用域(如定义的全局变量,及全局函数,即普 通函数)。 标识符的访问原则:如果在某一程序段中有一个以上的同名 标识符都有效,则标识符的作用范围越小,被访问到的优先级越 高。 如果希望访问作用范围更大的标识符,则可以用类名和作用 域运算符进行限定。如: CLocation::MoveTo(x,y)。 第7章 继承与派生