override-Override和hide在内存中是怎么实现的?

问题描述

Override和hide在内存中是怎么实现的?

今天老师讲了这个,说是让记住就好了,我想用内存来解释更容易理解吧。
Hide是一个static定义的方法,用static定义后在栈中就划分出位置进行存储了,所以定义的方法不容易改变,而Override没有想出来。可以这么理解吗?求大神解答

解决方案

这是由字节码来决定的,static方法会由invokestatic指令调用,而override方法会由invokevirtual指令调用,如果想要了解可以看看虚拟机方面的东西

解决方案二:

Override:(想不到比较贴切的翻译)指在继承时,父类函数声明为 virtual , 子类重新声明和实现该函数(函数名和参数完全相同,返回值不做约束)。子类该函数可以声明为 virtual ,也可以不加,不做限制,但是如果该子类还会继续被重载,则最好也声明为 virtual 。正是因为有virtual和Override的机制,C++才能够实现多态。

Hide:继承结构中的函数隐藏,指父类中声明了函数,子类中声明和定义了完全一致的函数,但是父类中函数没有声明为vitual,此时子类中的同名同参数函数会完全隐藏父类的函数。貌似和Override很像,但是其实现机制和Override完全不同,且会导致问题,应该避免使用。( virtual机制是使用虚表(vtable)实现的,虚表维护一个虚函数指针列表,但一个对象的某个虚函数被调用的时候,去虚表中查找并决定调用的是哪个函数,具体的实现,小编下次在讲。)

解决方案三:

override是重写,这个跟它的定义类型有关系吧!static就是堆,否则栈

解决方案四:

static的意思是这个对象或方法可以被任何其他类引用,override的意思是重写

解决方案五:

可以这么理解吧,一切皆是对象,你可以把标记为virtual的函数理解为一个动态的变量,基类中可以实现这个变量,在overide后,实际上是在派生类中改写了该变量,由于作用域的关系,所以多个派生类在调用该函数时不会造成影响。所以这也成就了多态。

时间: 2024-09-05 04:07:14

override-Override和hide在内存中是怎么实现的?的相关文章

Android加载大分辨率图片到手机内存中的实例方法_Android

还原堆内存溢出的错误首先来还原一下堆内存溢出的错误.首先在SD卡上放一张照片,分辨率为(3776 X 2520),大小为3.88MB,是我自己用相机拍的一张照片.应用的布局很简单,一个Button一个ImageView,然后按照常规的方式,使用BitmapFactory加载一张照片并使用一个ImageView展示. 代码如下: 复制代码 代码如下: btn_loadimage.setOnClickListener(new View.OnClickListener() {            

Android实战教程第七篇之如何在内存中存储用户名和密码

本文实例为大家分享了Android内存中存储用户名和密码的方法,供大家参考,具体内容如下 首先是配置文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layo

linux系统 动态共享库-动态共享库加载到内存中,怎样才能保证只有一份副本

问题描述 动态共享库加载到内存中,怎样才能保证只有一份副本 这几天一直在看关于动态共享库的知识,但看到一个地方,就不懂了,在网上搜索了一下!也没有找到答案!希望有哪位高手,帮小弟解答一下,小弟不胜感激! 问题:动态共享库,顾名思义,可以在多个进程间,进行共享!在系统中只保存一份副本,现在假设Process A已经将Lib A Load到物理内存,但当同样共享Lib A的Process B开始运行时,它是如何知道Lib A已经被加载到内存中,且如何找到这块物理内存?

mysql cluster存储引擎NDB,如何设置哪些数据不被LOAD到内存中?

问题描述 mysql cluster存储引擎NDB,如何设置哪些数据不被LOAD到内存中? mysql cluster存储引擎NDB,如何设置哪些数据不被LOAD到内存中?

ADO.Net与ADO在数据内存中的差异讨论

ado|数据 数据的内存中表示形式 在 ADO 中,数据的内存中表示形式为记录集.在 ADO.NET 中,它为数据集.它们之间有重要的差异. 表的个数 记录集看起来像单个表.如果记录集将包含来自多个数据库表的数据,则它必须使用 JOIN 查询,将来自各个数据库表的数据组合到单个结果表中. 相反,数据集是一个或多个表的集合.数据集内的表称为数据表:明确地说,它们是 DataTable 对象.如果数据集包含来自多个数据库表的数据,它通常将包含多个 DataTable 对象.即,每个 DataTabl

PHP 直接在共享内存中存储数据集

共享内存是一种在相同机器中的应用程序之间交换数据的有效方式.一个进程可创建一个可供其他进程访问的内存段,只要它分配了正确的权限.每个内存段拥有一个惟一的 ID(称为 shmid),这个 ID 指向一个物理内存区域,其他进程可在该区域操作它.创建并提供了合适的权限之后,同一台机器中的其他进程就可以操作这些内存段:读取.写入和删除. 这表明使用 C 语言编写的应用程序可与使用其他语言(比如 Java 或 PHP)编写的应用程序共享信息.它们都可以共享信息,只要它们可访问和理解该信息.共享内存在针对大

C/C++变量在内存中的存储

在C++语言中,有如下代码: char a; int b; int c; a='1'; b=1; printf("a = %x \r\n",a); printf("b = %x\r\n",b); c=a; printf("c = %x\r\n",c); 输出的结果是 a = 31 b = 1 c = 31 请按任意键继续. . . 这里 int型是4Byte char型是1Byet. a='1' 这条语句执行后,会在内存中分配1个字节大小的内存空

.NET内存中敏感数据的保护方案

从具体上来说,.NET元数据机制的设计,既方便了反射等强大特性的实现,又同时给代码安全及程序运行时安全带来了巨大的隐患.迄今为止,还未发现比较有效元数据可见性控制方法.当然,这不在本文的讨论范围之内.我还是更愿意在这篇文章在针对.NET的内存分配机制讨论一个更具体的问题:如何保护在内存中存储的敏感数据? String的驻留机制带来的安全性问题 String是代码中使用频率很高的对象类型.为了提高字符串的处理速度,节省内存空间,Microsoft为.NET String类设计了驻留机制.其大概的逻

将MySQL的临时目录建立在内存中的教程

  MySQL 系统会在内存(MEMORY)和磁盘(MyISAM)中建立临时表,如何能知道在磁盘中建立了多少临时表以及在内存中建立多少临时表呢?你可以通过下面命令获知: mysql> SHOW GLOBAL STATUS LIKE 'Created_tmp%tables'; +-------------------------+----------+ | Variable_name | Value | +-------------------------+----------+ | Create