指针实际区别与多态

指针的类型

不同类型指针的实际区别

问题引入:一个指向ZooAnimal的指针是如何地与一个指向整数的指针或一个指向template Array(如下,与一个 String 一并产生) 的指针有所不同呢?

ZooAnimal *px;
int *pi;
Array<String> *pta;

​ 以内存需求的观点来说,没有什么不同! (这个和8086中数据和指令的区别一样,地址没啥区别,只是看这个地址是不是pc指向的。) “指向不同类型之各指针” 间的差异,既不在其指针表示法不同,也不在其内容(代表一个地址)不同,而是在其所寻址出来的object类型不同。也就是说, “指针类型” 会教导编译器如何解释某个特定地址的内存内容及其大小,那么怎么知道“指针类型"呢?(我也不知道,可能是通过转换这种编译器指令吧。 这种指令大部分情况并不改变一个指针所含的真正地址,它只影响“被指出之内存的大小和其内容"的解释方式。

加入多态

​ 我们知道多态 是用指针或引用才可以实现,直接用对象就不可以。这个问题的答案,可以通过内存布局和 “这种指令大部分情况并不改变一个指针所含的真正地址,它只影响“被指出之内存的大小和其内容"的解释方式。” 来解释。当我们用 Base类来 实例化 derived 类时,派生类中属于基类的部分会被截取出来,强转成Base类。

Derived b;
Base ba = b;	// 这样会引起切割

ba.func();		// 调用 Base::func();

​ 那么最主要的 vptr呢? 这个 vptr是指向base类所有函数组成的 虚表还是 derived 类指向的虚表呢? 这个答案是 指向 Base类的 虚表,因为编译器会确保对象含有其类型应该有的 vptr

Base *ba = new Derived;	// 这样不会

ba->func();				// 调用 Derived::func();

​ 那么为什么用指针和引用就可以支持多态呢? 用指针和引用的话难道其vptr指向的是 derived类的虚表吗?确实如此。因为它们并不引发内存中任何 “与类型有关的内存委托操作”,会受到改变的,只有它们所指向的内存的 “大小和内容解释方式”而已。

关于 它们并不引发内存中 “与类型有关的内存委托操作”, 我的理解是,这段内存,编译器依然认为是其整体类型是 derived 类。但是由于是通过指针或引用来指向的,所以编译器在编译的时候还不知道其所指向内存的 “大小和内存解释方式”是否有变化,也就是执行期绑定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值