派生类成员的访问控制 访问控制:能否访问/怎样访问从父类继承得来的成员。 ·主要指派生类中新增成员和派生类外部函数访问派生类从父类继承的成员 继承方式不同,访问控制不同 公有继承(public) ·父类的公有和保护成员的访问属性保持不变 ·父类的私有成员不可直接访问 从父类继承的成员函数对父类成员的访问不受影响! http://math.ecnu.edu.cn/~jypan 7
http://math.ecnu.edu.cn/~jypan 派生类成员的访问控制 访问控制:能否访问/怎样访问从父类继承得来的成员。 ► 主要指派生类中新增成员和派生类外部函数访问派生类从父类继承的成员 继承方式不同,访问控制不同 † 从父类继承的成员函数对父类成员的访问不受影响! ► 父类的公有和保护成员的访问属性保持不变 ► 父类的私有成员不可直接访问 公有继承(public) 7
例:公有继承 Example class Point public: void initPoint(float x=0,float y=0); void move(float offx,float offy); float getx()const {return x;} float gety()const {return y;} private: f1oat×,y; Example class Rectangle:public Point { public: void initRect(float x,float y,float w,float h) initPoint(x,y);this->w=w;this->h=h; float geth()const {return h;} float getw()const {return w;} private: f1oath,w;/新增私有成员 http://math.ecnu.edu.cn/~jypan 8
http://math.ecnu.edu.cn/~jypan 例:公有继承 class Point { public: void initPoint(float x=0, float y=0); void move(float offx, float offy); float getx() const {return x;} float gety() const {return y;} private: float x, y; } class Rectangle: public Point { public: void initRect(float x,float y,float w,float h) { initPoint(x,y); this->w=w; this->h=h; } float geth() const {return h;} float getw() const {return w;} private: float h, w; // 新增私有成员 } Example Example 8
派生类成员的访问控制(续) 私有继承(private) ·父类的公有和保护成员都成为派生类的私有成员 ·父类的私有成员不可直接访问 保护继承(protected) ·父类的公有和保护成员都成为派生类的保护成员 ·父类的私有成员不可直接访问 十与私有继承的区别: 父类成员(特别是公有函数)可以在以后的派生中作为保护成员继承下去。 十私有继承后,父类成员(特别是公有函数)无法在以后的派生类中直接发挥作用, 相当于终止了父类功能的继续派生。因此,私有继承较少使用。 http://math.ecnu.edu.cn/~jypan
http://math.ecnu.edu.cn/~jypan 9 派生类成员的访问控制(续) † 私有继承后,父类成员(特别是公有函数)无法在以后的派生类中直接发挥作用, 相当于终止了父类功能的继续派生。因此,私有继承较少使用。 † 与私有继承的区别: 父类成员(特别是公有函数)可以在以后的派生中作为保护成员继承下去。 ► 父类的公有和保护成员都成为派生类的私有成员 ► 父类的私有成员不可直接访问 私有继承(private) ► 父类的公有和保护成员都成为派生类的保护成员 ► 父类的私有成员不可直接访问 保护继承(protected)
访问控制小结 ●父类成员函数访问父类成员:正常访问 ●派生类成员函数访问派生类新增成员:正常访问 ●父类成员函数访问派生类新增成员:不能访问 ●派生类成员函数访问父类成员:继承方式+成员本身访问属性 ●非成员函数访问派生类所有成员:只能访问公有成员 ·派生类成员按访问属性可划分为下面四类: -不可访问成员:父类的私有成员 -私有成员:父类继承的部分成员+新增的私有成员 -保护成员:父类继承的部分成员+新增的保护成员 -公有成员:父类继承的部分成员+新增的公有成员 如果没有指定继承方式,则缺省为private http://math.ecnu.edu.cn/~jypan 10
http://math.ecnu.edu.cn/~jypan 10 访问控制小结 父类成员函数访问父类成员:正常访问 派生类成员函数访问派生类新增成员:正常访问 父类成员函数访问派生类新增成员:不能访问 派生类成员函数访问父类成员:继承方式+成员本身访问属性 非成员函数访问派生类所有成员:只能访问公有成员 派生类成员按访问属性可划分为下面四类: - 不可访问成员:父类的私有成员 - 私有成员:父类继承的部分成员 + 新增的私有成员 - 保护成员:父类继承的部分成员 + 新增的保护成员 - 公有成员:父类继承的部分成员 + 新增的公有成员 † 如果没有指定继承方式,则缺省为 private
派生类访问控制:例一 class Person /川父类 public: Person(string str,int age )name(str) this->age age; void show() { cout <"Name:"<name <endl; cout <<"Age:"<<age<<endl; private: string name; /1姓名 int age; //年龄 } http://math.ecnu.edu.cn/~jypan 11
http://math.ecnu.edu.cn/~jypan 11 派生类访问控制:例一 class Person // 父类 { public: Person(string & str, int age ) : name(str) { this->age = age; } void show() { cout << "Name: " << name << endl; cout << "Age: " << age << endl; } private: string name; // 姓名 int age; // 年龄 };