这一部分要谈的是指针的类型。
Q1 : 一个指向class-a的指针,和一个指向class-b的指针 它们有什么区别?
比如:
Animal * a;
int *pi;
string * s;
相同之处:
从内存的角度来看,没有什么问题,它们都是在自己的内存空间里面放置一个地址。大小都是4。
不同之处:
不同指针之间的差异,是在其所寻址出来的object类型不同。也就是说,“指针类型”会教导编译器如何解释某个特定地址总的内存内容及其大小。也就是区别在于:
- 如何解释指针指向的这个内存空间里面的二进制数,比如unsigned int 和int 就是完全不一样的解释。
- 告诉编译器,指针可访问的偏移的长度是多少
我们在回到这个类指针的问题,如果有一个基类和一个派生类的指针,那么它们的区别是什么?
class Animal {
private:
int loc;
int id;
public:
...
};
class Bear : public Animal {
private:
char name[8];
int age;
public:
...
};
int main(){
Bear b;
//那么指针ap和bp有什么区别?
Animal * pa = &b;
Bear * pb = &b;
}
还是刚才的那个问题,ap 和bp有什么区别?
它们都指向的是派生类对象b的第一个字节的地方,其间的差别是,pb所涵盖的地址范围包含了整个bear 对象,但是pa所涵盖的地址只包含了bear对象中基类的部分。