基类与私有类的一些基本访问属性
- 基类的成员函数可以访问基类的所有成员
- 基类的成员函数无法访问派生类的新增成员(基类里没有这些成员,基类的成员函数不会也不可能有相应操作)
- 派生类可以访问自己新增的成员
- 派生类外只可以访问派生类的公有成员
- 派生类不可以访问从基类继承而来的私有成员
公有继承
概念
定义派生类时将继承方式指定为public的称为公有继承,以此建立的派生类叫做公有派生类,其基类叫做公用基类
性质
- 基类的公有成员在派生类中仍为公有成员,派生类所有的函数(继承来的,新增的)都可以访问它们
- 基类的保护成员在派生类中仍为保护成员,派生类所有的函数(继承来的,新增的)都可以访问它们
- 基类的私有成员在派生类中不是派生类的私有成员,它们仍然是基类的私有成员,派生类新增的函数不可以访问它们,只有继承而来的基类的成员函数可以访问它们
代码
```cppinclude
using namespace std;
class stu { private: string num; string name;
protected:
char sex;
public:
int age;
void SetStu1(const string &_num,const string &_name){num=_num,name=_name;};
void PrintStu1(void)
{
cout<<"No: "<<num<<endl;
cout<<"Name: "<<name<<endl;
}
};
class CStu:public stu { private: string addr;
public:
void SetStu2(const char&_sex){sex=_sex;};
void SetStu3(const int &_age){age=_age;};
void SetStu4(const string &_addr){addr=_addr;};
void PrintStu2(void)
{
cout<<"Sex: "<<sex<<endl;
cout<<"Age: "<<age<<endl;
cout<<"Address: "<<addr<<endl;
//cout<<"No: "<<num<<endl;
//cout<<"Name: "<<name<<endl;
}
};
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 / ```
私有继承和保护继承
一个将派生类中所有继承而来的成员设置为私有,另一个全部设置为保护,其他都一样
关于保护成员
ps.由于派生类不可以访问基类的私有成员,所以两次私有继承后,基类的所有成员均无法访问,而保护成员不管被继承了多少次,在派生类中依旧保持该访问属性,可以在派生类中被访问
三种继承的含义
ps.类间水平关系不需要知道被包含类的源代码,知道其公共接口(公有成员函数)即可
私有继承和保护继承可以用类间的水平关联关系来取代