第7章继承与派生 6.2类的继承方式 621公有继承(续二) 分析例6.1 C Point类的部分成员属性: C Point类的成员函数不能访问的成员有: int X; ∥继承基类的私有成员,类的成员函数不可访问 y ∥继承基类的私有成员,类的成员函数不可访问 C Point类的私有成员有: char Color[10] ∥己定义的私有成员 C Point类的公有成员有 int Getxo: ∥继承基类的公有成员,仍然是公有成员 nt Gety (; ∥继承基类的公有成员,仍然是公有成员 void Move To(int X,inty);∥继承基类的公有成员,仍然是公有成员 void setcolor(( char *c);∥自己定义的公有成员 void Showo ∥己定义的公有成员
6.2 类的继承方式 6.2.1 公有继承(续二) 分析例6.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章 继承与派生
赋值兼容规则 赋值兼容规则:是指在公有派生情况下, 派生类的对象可以作为基类的对象来使用的情 况。例:6.3 lsa和has-a的区别 类与类的关系:一个是继承和派生的问题 个是一个类使用另外一个类的问题
赋值兼容规则 • 赋值兼容规则:是指在公有派生情况下,一个 派生类的对象可以作为基类的对象来使用的情 况。例:6.3 • Isa和has-a的区别 类与类的关系:一个是继承和派生的问题;一 个是一个类使用另外一个类的问题
第7章继承与派生 6.2类的继承方式 622保护继承 保护继承的特点: (1)基类的私有成员不能被派生类的函数成员访问 2)基类的公有成员和保护成员在派生类中的访问权限变为保 护类型 例62将例6.1的继承方式改为保护继承,其他代码保持不变 class cPoint protected CLocation rivate char color[10 public CPoint(char*c) void Setcolor(char *c) void Showo
6.2 类的继承方式 6.2.2 保护继承 保护继承的特点: (1) 基类的私有成员不能被派生类的函数成员访问 (2) 基类的公有成员和保护成员在派生类中的访问权限变为保 护类型 例6.2 将例6.1的继承方式改为保护继承,其他代码保持不变 class CPoint : protected CLocation { private: char Color[10]; public: CPoint(char *c); void SetColor(char *c); void Show(); }; 第7章 继承与派生
第7章继承与派生 6.2类的继承方式 622保护继承(续一) 改为保护继承后,主函数不变编译时,是否正确? yoid main(void) CPoint p(Red") p Showo 错误:不能在主函数中访问 CLocation 类的函数 MoveTo(,只能在派生类的 p Move To(7, 8) 成员函数中访问 p Showo p SetColor("Green ") p Showo
6.2 类的继承方式 6.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章继承与派生 6.2类的继承方式 622保护继承(续二) 为实现点的移动,可在 C Point类中再添加一个公有成员函数 MoveTo0,如下 class CPoint: protected CLocation private char Color[10 public CPoint(char*c) void SetColor(char*c) void Showo 用基类名和域运算符(∷)可以 void MoveTo(int x, int y) 访问基类的成员函数 MoveTo 若不加限定,由于基类和派生类 t void CPoint: Move To(intx, int y) 都有成员函数 MoveTo(,将优先 调用派生类本身的同名成员函数 MoveTo CLocation:: Move To(x,y);
6.2 类的继承方式 6.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()