受保护的成员(protected):

1.和私有成员类似,受保护的成员对于类的用户来说是不可访问的

2.和共有成员类似,受保护的成员对于派生类的成员和友元来说是可访问的

3.派生类的友元只能通过派生类对象来访问基类的受保护成员,不能通过基类对象来访问基类的受保护成员

class base
{
protected:
int pro;
}; class sneaky :public base
{
friend void clobber(sneaky&);
friend void clobber(base&);
int j;
};
//正确
void clobber(sneaky &s)
{
s.j = s.pro = ;
}
//错误
void clobber(base &b)//基类对象
{
b.pro = ;
}

派生访问说明符:

派生访问说明符对于派生类的成员(及友元)能否访问其直接基类的成员没影响,对基类成员的访问权限只与基类中的访问说明符有关。

派生访问说明符的目的是控制派生类用户即派生类对象对于基类成员的访问权限。若派生访问说明符是private(private继承),则基类中所有成员对于派生类对象来说是私有的。

友元与继承

就像友元关系不能传递一样,友元关系也不能继承。基类的友元在访问派生类成员时不具有特殊性,类似地,派生类的友元也不能随意访问基类的成员

class base
{
protected:
int pro;
friend class pal;
};
class sneaky :public base
{
friend void clobber(sneaky&);
friend void clobber(base&);
int j;
};
class pal
{
public:
int f(base b)//正确,pal是base的友元
{
return b.pro;
}
int f2(sneaky s)//错误
{
return s.j;
}
int f3(sneaky s)//正确,pal是base的友元,所以pal能够访问base对象的成员,
{//这种可访问性包括了base对象内嵌在其派生类中的情况
return s.pro;
} };

当一个类将另一个类声明为友元时,这种友元关系只对做出声明的类有效,对于原来那个类来说,其友元的基类或者派生类不具有特殊的访问能力。

默认的继承保护级别

默认派生运算符由定义派生类所用的关键字来决定,默认情况下,使用class关键字定义的派生类是私有继承的,而使用struct关键字定义的派生类是共有继承的。

class base{};

struct d1:base{};//默认public继承

class d2:base{};//默认privat继承

使用struct关键字和class关键字定义类的唯一的差别是默认成员访问说明符和默认派生访问说明符

总结:

1.派生类的友元只能通过派生类对象来访问基类的成员

2.派生访问说明符不影响派生类成员或友元对基类成员的访问,只影响派生类对象对基类成员的访问

3.基类的友元只能访问基类成员,不能访问派生类成员,但可以访问派生类对象中的基类部分

【c++】面向对象程序设计之访问控制与继承的更多相关文章

  1. JavaScript 面向对象程序设计(下)——继承与多态 【转】

    JavaScript 面向对象程序设计(下)--继承与多态 前面我们讨论了如何在 JavaScript 语言中实现对私有实例成员.公有实例成员.私有静态成员.公有静态成员和静态类的封装.这次我们来讨论 ...

  2. Python基础(16)_面向对象程序设计(类、继承、派生、组合、接口)

    一.面向过程程序设计与面向对象程序设计 面向过程的程序设计:核心是过程,过程就解决问题的步骤,基于该思想设计程序就像是在设计一条流水线,是一种机械式的思维方式 优点:复杂的问题的简单化,流程化 缺点: ...

  3. javascript之面向对象程序设计(对象和继承)

    总结的文章略长,慎点. 知识点预热 引用类型:引用类型的值(对象)是引用类型的一个实例.在ECMAScript中,引用类型是一种数据结构,用于将数据和功能组织在一起.在其他面向对象语言中被称为类,虽然 ...

  4. Python基础(17)_面向对象程序设计(抽象类、继承原理、封装、多态,绑定方法)

    一.抽象类 抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化 1.在python中实现抽象类 import abc #利用abc模块实现抽象类 class All_file(metacl ...

  5. 刘志梅 201771010115 《面向对象程序设计(java)》 第十八周学习总结

    实验十八 总复习 实验时间 2018-12-30 1.实验理论知识 (1)第一个关键词:public称为访问修饰符,用于控制程序的其他部分对代码的访问级别. 第二个关键词:class表明java程序中 ...

  6. Java面向对象程序设计--与C++对比说明:系列3(Java 继承机制)

    继承(inheritance)背后的核心思想是:       bonus = b;    }      } Java没有像C++那样提供多继承机制,但提供了接口机制,在后面我们将详细探究接口机制的实现 ...

  7. 【c++】面向对象程序设计之关于继承

    面向对象程序设计的核心思想是数据抽象(类的接口与实现分离).继承和动态绑定 基类 虚函数:基类希望派生类各自定义适合自身的版本的函数 在c++中,当我们使用基类的引用或指针调用虚函数时将发生动态绑定. ...

  8. 实验二 Java面向对象程序设计

    实验二 Java面向对象程序设计 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计 ...

  9. JAVA课程实验报告 实验二 Java面向对象程序设计

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计  班级:1353  姓名:韩玉琪  学号:20135317 成绩:             指导教师:娄嘉 ...

随机推荐

  1. c语言 错误记录

    1.预处理错误 #include <>   //系统内部的 #include ""   // 自定义的 遇到 not find------解决方案:gcc -I 跟查找 ...

  2. upload 上传按钮组件 iview

    <!-- * @description 导入Excel * @fileName importExcel.vue * @author 彭成刚 * @date // :: * @version V1 ...

  3. 编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n(利用指针函数)

    *题目:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n(利用指针函数) public class 第三十九题按条件计算 ...

  4. AspNetCore容器化(Docker)部署(一) —— 入门

    一.docker注册安装 Windows Docker Desktop https://www.docker.com/products/docker-desktop Linux Docker CE h ...

  5. Vue之组件的生命周期

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 基于HLS(HTTP Live Streaming)的视频直播分析与实现

    转自:http://www.cnblogs.com/haibindev/archive/2013/01/30/2880764.html HLS(HTTP Live Streaming)的分析: HTT ...

  7. /etc/rc.d启动目录详解

    操作系统:CentOS6.6_32位 控制脚本目录/etc/rc.d,该目录下存在各个运行级别的脚本文件,执行ls /etc/rc.d,显示结果为:init.d  rc  rc0.d  rc1.d   ...

  8. perl学习之:@_ $_

    question 1 :数组@xxx调用时,每个元素应该用$xxx[0]/$xxx[1]...   来表示所以$_[0]表示@_的一个元素,和默认缺省变量$_无关,是两个东西请查阅数组元素调用相关章节 ...

  9. 安装完Centos 7后的一些处理

    1.安装dkms:dkms-2.2.0.3-31.1.noarch.rpm 2.安装显卡驱动:amdgpu-pro-18.10-572953 3.启动图形界面使用init 5 不能使用startx

  10. Leetcode 260.只出现一次的数字III

    只出现一次的数字III 给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次. 找出只出现一次的那两个元素. 示例 : 输入: [1,2,1,3,2,5] 输出: [3,5 ...