基类与私有类的一些基本访问属性

  1. 基类的成员函数可以访问基类的所有成员
  2. 基类的成员函数无法访问派生类的新增成员(基类里没有这些成员,基类的成员函数不会也不可能有相应操作)
  3. 派生类可以访问自己新增的成员
  4. 派生类外只可以访问派生类的公有成员
  5. 派生类不可以访问从基类继承而来的私有成员

公有继承

概念

定义派生类时将继承方式指定为public的称为公有继承,以此建立的派生类叫做公有派生类,其基类叫做公用基类

性质

  1. 基类的公有成员在派生类中仍为公有成员,派生类所有的函数(继承来的,新增的)都可以访问它们
  2. 基类的保护成员在派生类中仍为保护成员,派生类所有的函数(继承来的,新增的)都可以访问它们
  3. 基类的私有成员在派生类中不是派生类的私有成员,它们仍然是基类的私有成员,派生类新增的函数不可以访问它们,只有继承而来的基类的成员函数可以访问它们

    代码

    ```cpp

    include

    using namespace std;

class stu { private: string num; string name;

  1. protected:
  2. char sex;
  3. public:
  4. int age;
  5. void SetStu1(const string &_num,const string &_name){num=_num,name=_name;};
  6. void PrintStu1(void)
  7. {
  8. cout<<"No: "<<num<<endl;
  9. cout<<"Name: "<<name<<endl;
  10. }

};

class CStu:public stu { private: string addr;

  1. public:
  2. void SetStu2(const char&_sex){sex=_sex;};
  3. void SetStu3(const int &_age){age=_age;};
  4. void SetStu4(const string &_addr){addr=_addr;};
  5. void PrintStu2(void)
  6. {
  7. cout<<"Sex: "<<sex<<endl;
  8. cout<<"Age: "<<age<<endl;
  9. cout<<"Address: "<<addr<<endl;
  10. //cout<<"No: "<<num<<endl;
  11. //cout<<"Name: "<<name<<endl;
  12. }

};

int main(void) { stu s1; s1.SetStu1(“201701435”,”dhm”); s1.PrintStu1(); CStu s2; s2.SetStu1(“21200319”,”Hermann_Da”); s2.SetStu2(‘M’); s2.SetStu3(19); s2.SetStu4(“Jilin ChangChun China”); s2.PrintStu1(); s2.PrintStu2(); return 0; }

/ No: 201701435 Name: dhm No: 21200319 Name: Hermann_Da Sex: M Age: 19 Address: Jilin ChangChun China / ```

私有继承和保护继承

一个将派生类中所有继承而来的成员设置为私有,另一个全部设置为保护,其他都一样
关于保护成员
6.PNG
ps.由于派生类不可以访问基类的私有成员,所以两次私有继承后,基类的所有成员均无法访问,而保护成员不管被继承了多少次,在派生类中依旧保持该访问属性,可以在派生类中被访问

三种继承的含义

2.PNG
ps.类间水平关系不需要知道被包含类的源代码,知道其公共接口(公有成员函数)即可
私有继承和保护继承可以用类间的水平关联关系来取代