可见性和可达性,C#和C++

看C# premier有感,

以下是C#语言写的类

class aBase{protect string s;}

class aDerived:aBase{new private string s;}

new 关键字用以提示编译器,s 是一个新的变量,故意隐藏基类里面的s。

下面定义一个新的子类,

class aMostDerived:aDerived{

  void set(string str){s = str;}

}

在C++语言里面,编译器是先考虑可见性,再考虑可达性,因为aDerived 里面的s是继承层次里面最近的一个s,所以会锁定aDerived里面的s,然后考虑可达性的时候,会报错,因为这个s是private成员,不可达的。

在C#语言里面,编译器会先考虑可达性,aBase里面的s是public成员,aDerived里面的s是private成员,会先锁定aBase里面的s,编译器不会报错。

如果考虑可达性的时候,同时选中了两个s,就看可见性,继承层次哪个比较近了。

原文地址:https://www.cnblogs.com/howarddeng/p/9892479.html

时间: 2024-09-30 17:44:36

可见性和可达性,C#和C++的相关文章

volotile关键字的内存可见性及重排序

在理解volotile关键字的作用之前,先粗略解释下内存可见性与指令重排序. 1. 内存可见性 Java内存模型规定,对于多个线程共享的变量,存储在主内存当中,每个线程都有自己独立的工作内存,并且线程只能访问自己的工作内存,不可以访问其它线程的工作内存.工作内存中保存了主内存中共享变量的副本,线程要操作这些共享变量,只能通过操作工作内存中的副本来实现,操作完毕之后再同步回到主内存当中,其JVM内存模型大致如下图. 而JAVA内存模型规定工作内存与主内存之间的交互协议,其中包括8种原子操作: 1)

面向对象语言成员变量方法可见性在继承中的变化

最近做得的有点杂,接触到几种面向对象的语言,C#,C++,JAVA .在一个情景下,软件的框架已经写好了,我们要对其功能实现增加和修改,这种情况是经常发生的,那么在面向对象的程序设计中我们要怎么做呢.我们都知道面向对象语言有几个特点,多态,封装,继承,既然框架已经写好了,我们修改功能可以考虑用继承的方法去实现新的功能,那么这样做对原有的功能会有影响么?这就涉及到成员变量成员方法可见性在继承中的变化了. 首先,我们看C++ 派生类通过继承,将基类的成员作为自己的一部分,但不同的继承方式导致基类的成

并发编程之内存可见性

在上篇线程安全中,我们已经知道需要使用锁来同步管理对可变状态的访问操作.今天我们来看下并发编程的内存可见性问题. 同步代码块除了实现原子性或者临界区之外,其还保证了内存可见性,即保证其他线程可以看到状态的变化结果. private static boolean stop =false; private static int number = 0; public static class ReaderThread extends Thread { public void run() { while

Java深度历险(三)——Java线程?:基本概念、可见性与同步

开发高性能并发应用不是一件容易的事情.这类应用的例子包括高性能Web服务器.游戏服务器和搜索引擎爬虫等.这样的应用可能需要同时处理成千上万个请求.对于这样的应用,一般采用多线程或事件驱动的架构.对于Java来说,在语言内部提供了线程的支持.但是Java的多线程应用开发会遇到很多问题.首先是很难编写正确,其次是很难测试是否正确,最后是出现问题时很难调试.一个多线程应用可能运行了好几天都没问题,然后突然就出现了问题,之后却又无法再次重现出来.如果在正确性之外,还需要考虑应用的吞吐量和性能优化的话,就

Go语言之标志符可见性

Go的标志符,这个翻译觉得怪怪的,不过还是按这个起了标题,可以理解为Go的变量.类型.字段等.这里的可见性,也就是说那些方法.函数.类型或者变量字段的可见性.比如哪些方法不想让另外一个包访问,我们就可以把它们声明为非公开的:如果需要被另外一个包访问,就可以声明为公开的,和Java语言里的作用域类似. 在Go语言中,没有特别的关键字来声明一个方法.函数或者类型是否为公开的,Go语言是以大小写方式进行区分的.如果一个类型的名字是以大写开头,那么其他包就可以访问:如果以小写开头,其他包就不能访问. p

Android开发之蓝牙(Bluetooth)操作(二)--修改本机蓝牙设备的可见性,并扫描周围可用的蓝牙设备

版权声明:本文为博主原创文章,未经博主允许不得转载. 一. 修改本机蓝牙设备的可见性 二. 扫描周围可用的蓝牙设备 Eg: 一.  清单文件AdroidManifest.xml: [java] view plain copy <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android&q

JQuery选择器学习整理(基本选择器,层级选择器,伪类选择器,属性过滤,内容过滤,可见性过滤,范围选择器,排除选择器)

总的来说,选择器引擎规则就是: $('查询字符串'). 最常用最基本的就是:1.标签选择器(以文档元素作为选择符):$("div"): 2.id选择器(以ID作为选择符): $("#demo1"): 3.类选择器(以class作为选择符): $(".selected"): 4.群组选择器: $(".class1, .class2, .class3"): 5.后代选择器: $("p span") 多种规则的组

Java多线程之内存可见性

1.什么是JAVA 内存模型 Java Memory Model (JAVA 内存模型)描述线程之间如何通过内存(memory)来进行交互. 具体说来, JVM中存在一个主存区(Main Memory或Java Heap Memory),对于所有线程进行共享,而每个线程又有自己的工作内存(Working Memory),工作内存中保存的是主存中某些变量的拷贝,线程对所有变量的操作并非发生在主存区,而是发生在工作内存中,而线程之间是不能直接相互访问,变量在程序中的传递,是依赖主存来完成的. Jav

【慕课网学习笔记】Java共享变量的可见性和原子性

1. Java内存模型(Java Memory Model, JMM) Java的内存模型如下,所有变量都存储在主内存中,每个线程都有自己的工作内存. 共享变量:如果一个变量在多个线程中都使用到了,那么这个变量就是这几个线程的共享变量. 可见性:一个线程对共享变量的修改,能够及时地到主内存并且让其他的线程看到. 怎么理解上面的可见性的意思呢? 线程对共享变量的修改,只能在自己的工作内存里操作,不能直接对主内存中的共享变量进行修改.而且一个线程不能直接访问另一个线程中的变量的值,只能通过主内存进行