C++ 类的访问控制与继承

访问控制关键字介绍:

  • Public:成员在整个程序内都可以被访问。
  • private:成员可以被类的成员函数访问,但不能被使用该类的代码访问。
  • Protected:类希望有些成员能让派生类访问,不希望其他类访问。(只能通过派生类对象来访问基类数据成员)。
    派生类的成员或友元只能通过派生类对象来访问基类受保护的成员(派生类对象含有继承的基类数据成员),如果不是派生类对象就不能访问(例如在派生类中定义的基类对象),否则在派生类中定义一个基类对象就可以访问基类的protected成员,那protected的保护就失去了意义(protected只是给派生类访问,对于基类的用户来说是Private的。)

基类成员访问说明符和派生列表访问说明符:

  1. 基类成员访问说明符:控制派生类成员(及友元)对直接基类成员的访问权限。
  2. 派生列表访问说明符: 控制派生类用户(使用派生类对象/派生类的派生类的程序)对于基类成员的访问权限。其实就是设置派生类从基类继承的成员的访问权限,假设派生列表访问说明符是private,那么基类中的成员在派生类A中被设置成private,A的派生类不能访问这些成员,当然使用派生类的程序也不准!只有A的成员函数可以访问。

友元关系不能被继承:

类B是类A的友元类,可以访问A对象的成员,包括A内嵌在派生类对象中的情况(就是使用A派生类B中从A继承来的数据成员)。
友元关系不能被继承,假设类C是B的派生类,不能访问A对象的成员。

派生类对象向基类对象的转换

与派生访问说明符有关,遵循一个原则:
对于任何一段代码(比如在),只有在这段代码中基类的公有成员是可访问的,派生类向基类的转换才是可行的,反之不行。
举个例子,当类D受保护的(protected)地继承自类B,用户代码(使用类对象的程序)无法访问类B成员,在用户代码中不能将D对象转换为B对象,而D的成员函数,友元,派生类的成员和派生类的友元都可以访问B的成员,那么在这些地方可以将D对象转换为B对象。当D私有地继承自类B,在D的派生类成员,派生类的友元看来,D中含有的B成员是private的,不可访问,也就不能进行转换。

《C++ primer》15.5原文:

假定类D继承自类B:
对于用户代码:只有当D公有的继承B时,用户代码才能使用派生类向基类的转化,如果是受保护或私有,则用户代码不能转换。
对于D的派生类的成员和友元:如果D继承B的方式是公有或受保护的,则D的派生类的成员和友元可以使用D向B的类型转换。
对于D的成员函数和友元:不论D以什么方式继承B,D的成员函数和友元都能使用派生类向基类的转换。

改变类的个别成员可访问性

使用情况:比如派生类的派生列表访问说明符是private,但是派生类用户又想使用直接基类的私有成员。非私有成员。(派生类只能为那些它可以访问的名字提供using声明)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值