指针的类型

不同类型的指针,从内存需求的观点来说,没有什么不同!他们三个都需要足够的内存来繁殖一个机器地址,“指向不同类型之各指针”之间的差异,既不在其指针表示法不同,也不再其内容(代表一个地址)不同,而是在其所寻址出来的对象类型不同。也就是说,“指针类型”会导致编译器如何解释某个特定地址中的内存内容及其大小

1、  一个指向地址1000的整数地址,在32位机器上,将涵盖地址空间1000~1003

2、  那么,一个指向地址1000而类型为void*的指针,将涵盖怎样的地址空间呢?这个不知道,这就是为什么一个类型为void*的指针只能够含有一个地址,而不能通过它操作所指之对象的缘故。

其实转型是一种编译器指令,大部分情况下它并不改变一个指针所含的真正地址,它只影响“被指出之内存的大小和其内容”的解释方式。

Class ZooAnimal{

Public:

ZooAnimal();

Virtual~ZooAnimal();

Virtualvoid rotate();

Protected:

Intloc;

Stringname;

};

Class bear:public ZooAnimal

{

Public:

Bear();

~Bear()

Voidrotate();

Viratul void dance();

Protected:

Int cell_block;

};

但是考虑多态以后呢?加入Bear继承了ZooAnimal  同时是Public继承

Bear b;

ZooAnimal *pz = &b;

Bear* pb = &b;

他们每个都指向Bear对象的第一个字节,其间的差别是,pb所涵盖的地址包含整个Bear对象,而pz所涵盖的地址只包含Bear对象中的ZooAnimal子对象

除了在ZooAnimal中出现的成员,你不能够实用pz来直接处理Bear的任何成员。唯一例外的是通过virtual机制。

Pz->cell_block;

//不正确,cell_block不是ZooAnimal的一个成员,虽然我们知道pz当前指向一个Bear对象

((Bear*)pz)->cell_block;

//合法 经过一个明白的转型操作就没有问题

Pb->cell_block;

//合法  因为cell_block是Bear的一个成员

但是当我们写

Pz->rotate();时,(rotate是虚拟函数)pz的类型将在编译使其决定一下两点:

固定的可用接口,也就是说,pz只能够调用ZooAnimal的Public接口

该接口的访问级别(例如rotate()是ZooAnimal的一个public成员)

在每一个执行点,pz所指的对象类型可以决定rotate()所调用的实体,类型信息的封装并不是维护与pz之中,而是维护与link之中,此Link存在于对象的vptr和vptr所指的virtual table之间,在每一个virtual table中都有一个信息是type of info的信息

Bear b;

ZooAnimal za = b; //这样会引起切割

Za.rotate();  //调用ZooAnimal::rotate()

为什么rotate()所调用的是ZooAnimal实体而不是Bear实体?为什么za的vptr不指向Bear的virtual table

编译器在初始化以及赋值操作(将一个对象赋值给另一个对象)之间做了仲裁,编译器必须确保如果某个对象含有一个或一个以上的vptrs,那么vptrs的内容不会被基类对象初始化或改变

加入ZooAnimal->Bear->Panda  继承关系

ZooAnimal za;

ZooAnimal * pza;

Bear b;

Panda* pp = new Panda;

Pza = *b

将za或b的地址,或pp所含的内容(也是个地址)指定给pza,显然不是问题,一个指针或一个引用值所以支持多态,是因为它们并不引发内存中任何“与类型有关的内存委托操作”,会受到改变的只是它们所指向的内存的“大小和内容解释方式”而已。

所谓与类型有关的内存委托操作是指这个类型被编译所认识的大小,比如上面使用pz->cell_block.

大小和内容解释方式是在编译期间发生的,但是对于多态来说,是一个函数,但是函数是不依附于对象的,如果只要访问的对象中存在这个函数并且这个函数的访问级别可以达到,编译期间就可以实现,但是等到运行期间,如果发现这个函数是一个虚函数,这个时候在虚函数表中的第一个位置就是关于这个类型的所有信息,这个时候就会知道这个对象对应的真实类型是什么。需要分清这两点的差异

point类型·的更多相关文章

  1. 【.net 深呼吸】细说CodeDom(5):类型成员

    前文中,老周已经厚着脸皮介绍了类型的声明,类型里面包含的自然就是类型成员了,故,顺着这个思路,今天咱们就了解一下如何向类型添加成员. 咱们都知道,常见的类型成员,比如字段.属性.方法.事件.表示代码成 ...

  2. 【.net 深呼吸】细说CodeDom(4):类型定义

    上一篇文章中说了命名空间,你猜猜接下来该说啥.是了,命名空间下面就是类型,知道了如何生成命名空间的定义代码,之后就该学会如何声明类型了. CLR的类型通常有这么几种:类.接口.结构.枚举.委托.是这么 ...

  3. opencv中Mat与IplImage,CVMat类型之间转换

    opencv中对图像的处理是最基本的操作,一般的图像类型为IplImage类型,但是当我们对图像进行处理的时候,多数都是对像素矩阵进行处理,所以这三个类型之间的转换会对我们的工作带来便利. Mat类型 ...

  4. [C#] async 的三大返回类型

    async 的三大返回类型 序 博主简单数了下自己发布过的异步文章,已经断断续续 8 篇了,这次我想以 async 的返回类型为例,单独谈谈. 异步方法具有三个可让开发人员选择的返回类型:Task&l ...

  5. C# - 值类型、引用类型&走出误区,容易错误的说法

    1. 值类型与引用类型小总结 1)对于引用类型的表达式(如一个变量),它的值是一个引用,而非对象. 2)引用就像URL,是允许你访问真实信息的一小片数据. 3)对于值类型的表达式,它的值是实际的数据. ...

  6. salesforce 零基础学习(六十二)获取sObject中类型为Picklist的field values(含record type)

    本篇引用以下三个链接: http://www.tgerm.com/2012/01/recordtype-specific-picklist-values.html?m=1 https://github ...

  7. Dapper逆天入门~强类型,动态类型,多映射,多返回值,增删改查+存储过程+事物案例演示

    Dapper的牛逼就不扯蛋了,答应群友做个入门Demo的,现有园友需要,那么公开分享一下: 完整Demo:http://pan.baidu.com/s/1i3TcEzj 注 意 事 项:http:// ...

  8. ElasticSearch 5学习(9)——映射和分析(string类型废弃)

    在ElasticSearch中,存入文档的内容类似于传统数据每个字段一样,都会有一个指定的属性,为了能够把日期字段处理成日期,把数字字段处理成数字,把字符串字段处理成字符串值,Elasticsearc ...

  9. js:给定两个数组,如何判断他们的相对应下标的元素类型是一样的

    题目: 给Array对象原型上添加一个sameStructureAs方法,该方法接收一个任意类型的参数,要求返回当前数组与传入参数数组(假定是)相对应下标的元素类型是否一致. 假设已经写好了Array ...

  10. C++11特性——变量部分(using类型别名、constexpr常量表达式、auto类型推断、nullptr空指针等)

    #include <iostream> using namespace std; int main() { using cullptr = const unsigned long long ...

随机推荐

  1. svn添加新文件自动忽略

    背景:做项目,用的客户端TortoiseSVN1.8,发现新建的文件,不是问号(?),而是自动忽略的减号,提交的时候也确实没有,说明不是符号混乱,确实是被忽略了,网上找了解决方案记录如下: 查看svn ...

  2. Java Day03 面向对象程序设计

    1.面向对象 面向对象是指一种程序设计泛型,同时也是一种程序开发的方法. 2.类 类是一种抽象的概念,类中包含了数据与对数据的操纵. 具有相同特性(数据元素)和行为(功能)的对象的抽象就是类.类是对象 ...

  3. Unsupported major.minor version 51.0解决方案

    在使用myeclipse创建map/reduce项目,或者运行hadoop程序时: 在安装hadoop-eclipse-plugin插件会报:Unsupported major.minor versi ...

  4. docker安装升级linux内核(2.6.32->3.12.17)

    1.内核升级环境准备 #查看已经安装的和未安装的软件包组,来判断我们是否安装了相应的开发环境和开发库:yum grouplist#一般是安装这两个软件包组,这样做会确定你拥有编译时所需的一切工具yum ...

  5. iScroll屏幕滑动函数封装总结

    //iScroll.js屏幕滚动函数 function funScroll(a,b) { var d; function beforload() { d = new iScroll(a, { chec ...

  6. 淘淘商城_day03_课堂笔记

    今日大纲 实现商品的编辑 实现商品的规格参数功能 搭建前台系统 实现首页商品类目的显示 商品的编辑 数据的编辑核心是:数据回显. 编辑按钮事件 判断选中的行数 弹出window 加载编辑页面,在页面加 ...

  7. JS逻辑运算大于小于比较

    遇到这个问题,结果测试了好半天终于发现原因, 例子: var az = $('#a').css('zIndex'); // 1001 var bz = $('#b').css('zIndex'); / ...

  8. CodeForces 698B Fix a Tree

    并查集,构造. 先看一下图的特殊性,按照这种输入方式,一个点的入度最多只有$1$,因此,问题不会特别复杂,画画图就能知道了. 如果给出的序列中已经存在$a[i]=i$,那么随便取一个$a[i]=i$的 ...

  9. python连接MongoDB

    1.安装pymongo库 windows下: pip install pymongo 或者 easy_install install pymongo 2.使用pymongo模块连接mongoDB数据库 ...

  10. Cells(Rows.Count, 1).End(xlUp).Row的含义

     NextRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row + 1     这句话的意思是 取活动单元表的第一列最后一个有值的行的下一行行号. ...