一、protected成员

1. 受保护的成员的可访问性

  • 对于一个类的protected成员,①该类的用户(如类对象)不能访问它,②该类的派生类的成员(及其友元)可以访问它。
  • 派生类的成员及其友元不能访问其基类对象的受保护成员,它们只能访问继承到派生类对象中的受保护成员
  • 派生类的成员及其友元只能访问派生类对象中的基类部分的protected成员,不能访问普通的基类对象中的protected成员

借助下面的例子加深理解:

class Base {
protected:
int proc = 0;
}; class Derv : public Base {
void set_base_false()
{
Base b;
b.proc = 1; //[Error] 'int Base::proc' is protected
}
void set_base_true()
{
Derv d;
d.proc = 1;
}
void set_base_true2()
{
proc = 1; //访问该派生类继承而来的proc成员
}
};

二、三种继承方式

1. 派生访问说明符

对于派生类的成员及友元能否访问其直接基类的成员没什么影响

目的:控制派生类用户(包括派生类的派生类在内)对于基类成员的访问权限

2. 继承方式不影响派生类的成员及其友元访问基类的成员

class Base {
public:
void pub_mem();
protected:
int prot_mem;
private:
int priv_mem;
}; //公有继承
class Pub_derv : public Base {
int f1() { pub_mem(); }
int f2() { return prot_mem; }
int f3() { return priv_mem; } //错误:派生类不可访问private成员
}; //私有继承
class Priv_derv : private Base {
int f1() { pub_mem(); }
int f2() { return prot_mem; }
int f3() { return priv_mem; } //错误:派生类不可访问private成员
};

3. 继承方式影响派生类对象及其派生类访问基类的成员

公有继承:派生类中(从基类中)继承而来的成员都遵循其原有的访问说明符

私有继承:派生类中(从基类中)继承而来的成员的访问说明符都是private

保护继承:派生类中(从基类中)继承而来的成员,若其在基类中的访问说明符是public,则在派生类中的访问说明符变为protected

	Pub_derv d1;		//公有继承而来的派生类对象d1
Priv_derv d2; //私有继承而来的派生类对象d2
d1.pub_mem(); //正确:pub_mem()在派生类中是public的
cout << d1.prot_mem << endl; //错误:prot_mem在派生类中是protected的,但类的对象无法访问protected成员
d2.pub_mem(); //错误:pub_mem()在派生类中是private的

补充:其实题目中所说的基类的成员是指继承到派生类中的基类的成员(即,派生类的成员的基类部分

三、派生类向基类转换的可访问性

0. 影响因素

使用该转换的代码

派生类的派生访问说明符

1. D继承自B

  • D公有地继承B时,用户代码才能使用派生类向基类的转换(用户代码可访问B的公有成员)
  • 如果B是D的直接基类,则D的成员和友元可以使用派生类向基类的转换(D的成员和友元可访问B的公有成员)
  • D不是私有地继承B时,则D的派生类的成员和友元可以使用D向B的类型转换(D的派生类的成员和友元可访问B的公有成员)

小结:对于代码中的某个给定节点来说,如果基类的公有成员是可访问的,则派生类向基类的类型转换也是可访问的。

protected、public、private的更多相关文章

  1. 简述 private、 protected、 public、 internal 修饰符的访问权限

    简述 private. protected. public. internal 修饰符的访问权限. private : 私有成员, 在该类的内部才可以访问. protected : 保护成员,该类内部 ...

  2. PHP中private、public、protected的区别详解

    先简单粗俗的描述下:public 表示全局,类内部外部子类都可以访问:private表示私有的,只有本类内部可以使用:protected表示受保护的,只有本类或子类或父类中可以访问: 再啰嗦的解释下: ...

  3. 简述 private、protected、 public、 internal修饰符的访问权限

    1.private: 私有的,只能在此类中访问 2.protected: 受保护的,只能在此类及其继承类中访问 3.public: 公开的,没有访问限制 4:internal: 内部的,只能在当前程序 ...

  4. private、public、protected和默认

    类中的域最好标记为private: 方法最好标记为public: private:仅对本类可见 public:对所有类可见 protected:对本包和对所有子类可见 默认(什么都不写):对本包可见 ...

  5. JavaScript实现类的private、protected、public、static以及继承

    JavaScript中的类 JavaScript实际上是一种弱类型语言,与C++和Java等语言不同.因此,在JavaScript中,没有强调类(class)这一概念,但实际运用中,类还是很重要的,比 ...

  6. private、 protected、 public、 internal 修饰符

    private : 私有成员, 在类的内部才可以访问. protected : 保护成员,该类内部和继承类中可以访问. public : 公共成员,完全公开,没有访问限制. internal: 在同一 ...

  7. C++类:private、public、friend、protected的区别

           private和public的作用是让编译器帮你检查某些模块是否使用了他没权限使用的模块,也就是生成可执行代码的时候做权限检查.比如,公司里各个部门有自己私有的信息,财务部可以看所有员工 ...

  8. private、 protected、 public、 internal 修饰符的访问权限

    private : 私有成员, 在类的内部才可以访问. protected : 保护成员,该类内部和继承类中可以访问. public : 公共成员,完全公开,没有访问限制. internal: 当前程 ...

  9. private、public、this关键字

    private关键字 概念:私有的,一种权限修饰符,用来修饰类的成员 特点:被修饰的成员只能在本类中访问 用法: - 1. private 数据类型 变量名: - 2. private 返回值类型 方 ...

随机推荐

  1. chromium之dynamic_annotations

    看看介绍 // This file defines dynamic annotations for use with dynamic analysis // tool such as valgrind ...

  2. 简单的HTTP协议

    HTTP 协议和 TCP/IP 协议族内的其他众多的协议相同,用于客户端和服务器之间的通信. 请求访问文本或图像等资源的一端称为客户端,提供资源响应的一端称为服务器端. 在两台计算机之间使用 HTTP ...

  3. SQL Server 2012 - 数据更新操作

    SELECT * FROM dbo.Student; --1, 插入数据 Insert ,逗号分隔可以同时插入多条 INSERT dbo.Student ( StuID, Class, StuName ...

  4. 本人擅长Ai、Fw、Fl、Br、Ae、Pr、Id、Ps等

    本人擅长Ai.Fw.Fl.Br.Ae.Pr.Id.Ps等软件的安装与卸载,精通CSS.JavaScript.PHP.ASP.C.C++.C#.Java.Ruby.Perl.Lisp.python.Ob ...

  5. delphi 2010以上 安装 第三方控件

    delphi-“can't be installed because it is not a design time package. 一定要先装 dcl*.dpk ----------------- ...

  6. Java实例 Part1:Java基础输出语句

    ** Part1:Java基础输出语句 ** 第一部分最基础,就是标准的输出语句. ps:(目前还没熟悉这个编辑器,先尝试一下) Example01 : 输出"hello world&quo ...

  7. MySQL 5.7.21 免安装版配置教程

    MySQL是世界上目前最流行的开源数据库.许多大厂的核心存储往往都是MySQL. 要安装MySQL,可以直接去官方网站下载.本教程将说明对于MySQL的免安装版如何进行配置和安装. 官方下载:http ...

  8. django的Request-7

    目录 1. 从url中获取截取 2. QueryDict (1). QueryDict.get(key, [default]) (2). QueryDict.getlist(key, [default ...

  9. Java学习笔记十七:Java中static使用方法

    Java中static使用方法 一:Java中的static使用之静态变量: 我们都知道,我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立.然而在某些时候,我们更希望该类所有的 ...

  10. C# 获取UTC 转换时间戳为C#时间

    获取UTC /// <summary> /// 获取时间戳 /// </summary> /// <returns>UTC</returns> publ ...