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 ...
随机推荐
- Eclipse常用功能
功能(Functions):内置运行java程序的插件(JDT:java develop tools)工作集(WorkSet)(Task list)计划任务管理器(Mylyn)系统配置(Prefere ...
- Careercup - Facebook面试题 - 5890898499993600
2014-05-01 02:30 题目链接 原题: Given a matrix of letters and a word, check if the word is present in the ...
- asp.net中的mysql传参数MySqlParameter
注意在asp.net中传参 string sql="select name,id from user where id=@id"; //@idm不需要引号 MySqlParamet ...
- MYSQL存储过程实现in传入参数 where in('1','2')
android 服务器端开发中遇到这么一个问题: 突然发现将字符串传入到存储过程,参数为 '1','2' ,竟然执行无效 所以看到网上有在存储过程中直接拼凑sql的代码,今天也试了一下,可以执行了, ...
- 来吧,给你的Winform列表控件画个妆
前言 以前看别人的控件好看只有羡慕的份:以前觉得控件重绘是个很复杂的东西:以前知道MSDN很全面很专业却一直没有好好用起来: 作为初级程序猿,不能原地踏步,来吧,让我们一起把 TreeView 美化一 ...
- linux 下安装 nginx
安装nginx版本为1.7.5 一.下载nginx 官方地址:http://www.nginx.org/ 下载地址:http://nginx.org/download/ Nginx官网提供了三个类型的 ...
- Jquery 判断浏览器类型
$(function() { //FireFox2及以上 if ($.browser.MozillaSideBar && $.browser.version >= "1 ...
- log4j安装与简介
问题描述: 在应用程序中添加日志记录总的来说基于三个目的: (1) 监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作: (2) 跟踪代码运行时轨迹,作为日 ...
- Leetcode#80 Remove Duplicates from Sorted Array II
原题地址 简单模拟题. 从先向后遍历,如果重复出现2次以上,就不移动,否则移动到前面去 代码: int removeDuplicates(int A[], int n) { ) return n; ; ...
- iOS开发网络编程之断点续传-NSURLConnection
最近在做一个小项目的时候,发现使用NSURLSession或者AFNNetworking进行断点续传时诸多的不便,于是自己封装了一个类来实现断点续传,在程序重新启动时仍然可以继续下载(需自己调用方法) ...