C++三种继承方式的异同

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");
}
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值