Protected Member Access
https://msdn.microsoft.com/en-us/library/bcd5672a.aspx
官方的说法The protected keyword is a member access modifier. A protected member is accessible within its class and by derived class instances.
protected关键字是一个成员访问修饰符。一个protected的成员,一个protected成员,在其所在的类中,可由其派生类的实例访问。
可访问性级别的介绍:
https://msdn.microsoft.com/en-us/library/ba0a1yw2.aspx
protected :Access is limited to the containing class or types derived from the containing class.
protected关键字:只能由包含的类进行访问,或者从包含该成员的类所派生的类进行访问。
疑惑的地方:错误观点我本以为只要是派生类的实例,就可以访问受保护的成员。
子类的实例,可以赋值给父类类型的变量。通过父类类型的变量,是不允许访问protected成员的。
A question I got recently was about access to protected methods from a derived class.
Clearly that’s what “protected” means – that you can access it from a derived class.
In that case, why doesn’t this work?
/// <summary>
/// 有蹄类动物
/// </summary>
class Ungulate
{
protected void Eat()
{
/* whatever */
}
} /// <summary>
/// 长颈鹿
/// </summary>
class Giraffe : Ungulate
{
public static void FeedThem()
{
Giraffe g1 = new Giraffe();
Ungulate g2= new Giraffe();
g1.Eat(); // fine
g2.Eat(); // compile-time error “Cannot access protected member”
}
}
What the heck?
Giraffe is derived from Ungulate, so why can’t it always call the protected method?
To understand, you have to think like the compiler.
The compiler can only reason from the static type information, not from the fact that we know that at runtime //reason from 根据...进行推论
g2 actually will be a Giraffe. For all the compiler knows from the static type analysis, what we’ve actually got here is
/// <summary>
/// 有蹄类动物
/// </summary>
class Ungulate
{
protected virtual void Eat()
{
/* whatever */
}
} /// <summary>
/// 斑马
/// </summary>
class Zebra : Ungulate
{
protected override void Eat()
{
/* whatever */
}
} /// <summary>
/// 长颈鹿
/// </summary>
class Giraffe : Ungulate
{
public static void FeedThem()
{
Giraffe g1 = new Giraffe();
Ungulate g2 = new Zebra();
g1.Eat(); // fine
g2.Eat(); // compile-time error “Cannot access protected member”
}
}
We can call Ungulate.Eat legally from Giraffe,
but we can't call the protected method Zebra.Eat from anything except Zebra or a subclass of Zebra.
Since the compiler cannot determine from the static analysis that we are not in this illegal situation, it must flag it as being illegal.
总结,protected成员的使用。
1.在包含该成员的类的内部使用。
2.在派生类的内部使用
3.需要注意的是,派生类的实例对象,想要调用protected成员的时候,不能由第三方进行调用。
派生类的实例对象,可以在包含protected的成员里面,或者子类里面。调用protected成员。
这里的派生类,只有一个层次。
class A
{
protected int Number;
}
class B:A
{
}
class C:B
{
B b = new B();
//如果尝试访问Number的话会提示错误。 protected的成员,必须由类B或者B的派生类才可以访问。
//b.Number=10;
}
在类C中可以有B的实例,但是无法在C中通过B的实例去访问protected成员Number。
因为在C从B进行继承的时候,C中Number的父类是B而不是A。
所以,protected成员,只能在本身包含的类中使用,或者派生类中使用。这里的父类,只包含一个层级。
参考资料
Why Can’t I Access A Protected Member From A Derived Class?
Why Can’t I Access A Protected Member From A Derived Class, Part Two: Why Can I?
Why Can’t I Access A Protected Member From A Derived Class, Part Three
Protected Member Access, Part Four
Protected Semantics, Part Five: More on immutability
Protected Member Access的更多相关文章
- leetcode 编译问题:Line x: member access within null pointer of type 'struct TreeNode'
参考: LEETCODE 中的member access within null pointer of type 'struct ListNode' 解决 leetcode 编译问题:Line x: ...
- QT编译错误:member access into incomplete type 'QMouseEvent'
想在QT程序中使用鼠标事件,添加重载的响应函数,并实现后,一直提示 member access into incomplete type 'QMouseEvent' 既然使用了QMouseEvent类 ...
- member access within misaligned address 0x0000002c3931 for type 'struct ListNode‘
From MWeb 在做leetcode 第2题时使用C语言编写链表时报错 错误复现 错误原因 解决办法 错误复现 报错时的代码如下 /** * Definition for singly-linke ...
- protected: C++ access control works on per-class basis, not on per-object basis
一个很简单的问题: //为什么BASE::foo()中可以直接通过p访问val? 看本记录标题,这个问题困扰了很长一段时间,终于解决class BASE { private: ...
- 141. 环形链表 LeetCode报错:runtime error: member access within null pointer of type 'struct ListNode'
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode ...
- member access within misaligned address 0x000000000031 for type 'struct ListNode', which requires 8 byte alignment
在做LeetCode的two sum题目的时候,提交代码遇到了如题的runtime error,后来在一篇博客上看到了解决方法. 现有如下结构体: struct ListNode { int val; ...
- The third column indicates whether subclasses of the class declared outside this package have access to the member.;
总结1.modifier 改性剂 修饰符 修饰语 调节器access modifier 访问修饰符 存取权限 存取修饰词 存取修饰字官网“can”Access level modifiers dete ...
- Access the value of a member expression
Access the value of a member expression 解答1 You can compile and invoke a lambda expression whose bod ...
- 深入浅出OOP(五): C#访问修饰符(Public/Private/Protected/Internal/Sealed/Constants)
访问修饰符(或者叫访问控制符)是面向对象语言的特性之一,用于对类.类成员函数.类成员变量进行访问控制.同时,访问控制符也是语法保留关键字,用于封装组件. Public, Private, Protec ...
随机推荐
- Fibonacci数
Fibonacci数 时间限制:3000 ms | 内存限制:65535 KB 难度:1 描述 无穷数列1,1,2,3,5,8,13,21,34,55...称为Fibonacci数列,它可以递 ...
- git check 分支代码
1.git clone xxx.git; 2.git branch -r //查看分支 3.git checkout origin/分支名字 -b 本地新建分支名字 //从远程分支名字 down代码 ...
- 服务器端spice配置详解
1. 安装必要的工具 sudo apt-get install build-essential autoconf git-core intltool 2. 安装必要的依赖包 -dev libxfixe ...
- angular 服务
在Angular里面,services作为单例对象在需要到的时候被创建,只有在应用生命周期结束的时候(关闭浏览器)才会被清除.而controllers在不需要的时候就会被销毁了.服务用于在控制器之间进 ...
- 2463: [中山市选2009]谁能赢呢?- BZOJ
Description小明和小红经常玩一个博弈游戏.给定一个n×n的棋盘,一个石头被放在棋盘的左上角.他们轮流移动石头.每一回合,选手只能把石头向上,下,左,右四个方向移动一格,并且要求移动到的格子之 ...
- jquery的一些用法
一.选择器 单选按钮:$(this).find(".answer").find("input[name='answer_" + id + "']:ch ...
- Unity3D 游戏开发构架篇 —— 动态大场景生成 = 区域加载+对象池管理
项目做一个类似无尽模式的场景,想了一想,其实方法很简单,做一个相关的总结. 主要先谈一谈构架,后期附上代码. 一.区域加载 其实无尽场景的实现很简单,因为屏幕限制,那么不论何时何地,我们只能看到自己的 ...
- poj 2031 Building a Space Station(最小生成树,三维,基础)
只是坐标变成三维得了,而且要减去两边的半径而已 题目 //最小生成树,只是变成三维的了 #define _CRT_SECURE_NO_WARNINGS #include<stdlib.h> ...
- C# 委托的”四步走“
看了一本<深入了解C#>感觉很不错,对于委托的讲解,给大家摘录了下来! 1.什么是委托 我的拙见:委托就是将方法作为参数,进行传递的 书中的记载:将某种行为“包含”在一个对象中,这个对象可 ...
- java基础知识回顾之java Thread类学习(八)--java多线程通信等待唤醒机制经典应用(生产者消费者)
*java多线程--等待唤醒机制:经典的体现"生产者和消费者模型 *对于此模型,应该明确以下几点: *1.生产者仅仅在仓库未满的时候生产,仓库满了则停止生产. *2.消费者仅仅在有产品的时 ...