1、类成员的三种类型
public成员可以被任何类访问,
protected成员限于自己和子类访问。在同一个类中使用,其访问权限相当于私有成员;但是在派生时,他的访问权限相当于公有成员
private成员限于自己访问,即仅可在自己的类内使用。
2、对于公有继承方式:
·基类成员对派生类的可见性对派生类来说,
基类的公有成员和保护成员可见:基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态;
基类的私有成员不可见:基类的私有成员仍然是私有的,派生类不可访问基类中的私有成员。
所以, 对派生类对象来说,基类的公有成员是可见的,其他成员是不可见。在公有继承时,派生类的对象可以访问基类中的公有成员;派生类的成员函数可以访问基类中的公有成员和保护成员。
3、对于私有继承方式:
·基类成员对派生类的可见性对派生类来说,
基类的公有成员和保护成员是可见的:基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问;
基类的私有成员是不可见的:派生类不可访问基类中的私有成员。
所以,对派生类对象来说,基类的所有成员都是不可见的。在私有继承时,基类的公有和保护成员只能由直接派生类的成员(而非对象)访问,而无法再往下继承。
4、对于保护继承方式:
·基类成员对派生类的可见性对派生类来说,
基类的公有成员和保护成员是可见的:基类的公有成员和保护成员都作为派生类的保护成员,并且可以被其他成员访问,但是不能被这个派生类的对象所访问;
基类的私有成员是不可见的:派生类不可访问基类中的私有成员。
所以,对派生类对象来说,基类的所有成员都是不可见的。在保护继承时,基类的成员也只能由直接派生类的其他成员(而非对象)访问,而无法再往下继承。
这种继承方式与私有继承方式的情况相同。两者的区别仅在于对派生类的成员而言,但是,如果派生类作为新的基类继续派生时,二者会有明显区别 。
例如:B类以私有方式继承了A类后,B类又派生出新类C,那么C类的其他成员以及派生类的对象都不能访问间接从A类中继承来的成员(因为在B类中他们属于私有成员,不管以什么方式派生出C类,都无法访问私有成员)
如果B类以保护方式继承了A类后,B类由派生出新类C(假设以公有方式继承),那么C类的其他成员(其对象除外)就可以访问间接从A类中继承来的成员(因为在B类中他们属于保护成员,以公有继承的方式派生出C类后,就跟B类公有成员一样可以被访问)
其实B类私有继承A类,虽然A类的public和protect在B类都会变为私有成员,但只要在B类的public里定义一个函数去访问A类中的成员,再让C类继承B类,那么在C类中也就可以间接使用A类中的成员了。
#include< iostream >
#include< string>
using namespace std;
class Employee
{
public:
void get_info()
{
cout << "员工姓名是:" << m_chName << endl ;
cout << "员工ID是:" << m_iId << endl ;
cout << "员工性别是:" << m_chSex << endl ;
}
void set_info(string name,int id,string sex)
{
m_chName = name;
m_iId = id;
m_chSex = sex;
}
private:
string m_chName;
int m_iId;
string m_chSex;
};
class Operator : private Employee /私有继承
{
public:
void fun(string name,int id,string sex) //用函数访问Employee类
{
set_info(name,id,sex);
get_info();
}
};
class Operator1 : public Operator
{
public:
void fun1(string name,int id,string sex)
{
fun(name,id,sex); //通过Operator类访问Employee类成员
}//其实这里也可以不用定义函数,下面Operator1 B;后,直接B.fun("sss",111,"girl")就可以了
};
int main()
{
Operator A;
A.fun("zzz",123,"boy");
Operator1 B;
B.fun1("sss",111,"girl");
}