类的私有继承方式
①基类公有成员和保护成员都作为私有成员被派生类继承,派生类自身的函数可直接访问他们,但是派生类对象则只能通过本类的公有函数间接地访问它们。
②基类的私有成员成为派生类中更加封闭的私有成员,派生类内部成员函数也无法直接访问它们。派生类的函数只能通过调用基类的公有或保护成员函数访问它们。
③在派生类之外,无法通过派生类对象直接访问从基类继承的任何成员。
接下来,我们给出一段代码,解析一下私有继承的原理
上图是基类的定义:
char m_strName[10]、int m_nAge、int m_nSex均为基类的私有成员,void Register(char *name,int age,char sex)为私有数据成员方法
pubic下是公有成员方法
上图我们Employee类私有继承于Person类
char m_strDept[20] 和 float m_fSalary 均是Employee类的私有成员
public体下,是它的公有成员和构造函数
继承类函数体的编写
Person::Register调用基类的Register函数,Register函数为基类的为私有数据成员方法,即①基类公有成员和保护成员都作为私有成员被派生类继承,派生类自身的函数可直接访问他们,但是派生类对象则只能通过本类的公有函数间接地访问它们。
strcpy函数是复制字符串的,接受两个参数,一个是被复制字符串,另一个新字符串。
void Employee::ShowMe()编写函数体
char name[15]定义一个字符数组
GetName()是基类的公有成员函数,通过私有继承为派生类的私有成员函数,但派生类自身的函数可直接访问他们。
GetSex()和GetAge()同上
主函数的编写
首先我们为Employee定义了一个对象emp
第一个emp.ShowMe()调用的是Employee类构造函数,只有默认参数
第二个emp.ShowMe()调用的是Employee类Register函数传参后的内容
emp.GetEmployeeAge()为Employee类的公有成员,我们私有继承下的对象(③在派生类之外,无法通过派生类对象直接访问从基类继承的任何成员。)并不能直接获取基类的数据,所以我们需要间接获取,在这里GetEmployeeAge()就作为派生类的公有函数,访问基类的公有函数。
上图是基类函数的函数体
保护继承与私有继承大致相同
基类成员在派生类中的访问属性
基类中的成员 | 在公有派生类中的访问属性 | 在保护派生类中的访问属性 | 在私有继承类中的访问属性 |
公有成员 | 公有 | 保护 | 私有 |
保护成员 | 保护 | 保护 | 私有 |
私有成员 | 不可直接访问 | 不可直接访问 | 不可直接访问 |