每个指针都有一个相关的类型。不同数据类型的指针之间的区别不是在指针的表示上,也不在指针所持有的值(即地址)上——对所有类型的指针这两方面都是相同的(函数指针除外)。不同之处在于指针所指的对象的类型上。指针的类型可以指示编译器怎样解释特定地址上内存的内容,以及该内存区域应该跨越多少内存单元。
例如:int *m_pInt=&a; double *m_pDou=&b;m_pInt和m_pDou分别为int型和double型的指针。本质上m_pInt也可以指向存储数值b的内存地址(内存地址是没有类型之分的),但编译器会报错。为什么呢?假设a占据内存地址1000——1003,而b占据1004——1011。当将b的内存地址赋给m_pInt,编译器只提取1004——1007这么长跨度的内存地址所存储的值,这与b值相去甚远。所以上述做法是能够的,但不允许!
在C++中,向上转型和多态中都用到了指针。一个不留神,你就会着道。
对于多态,假设有四个类CAnimal,CFeline,CTiger,CCat,它们的继承关系如右图。每种动物都有自己叫的声音,例如老虎是咆哮,而猫则是“喵喵”;不管是老虎还是猫,他们都属于动物,所以可以用基类的指针指向派生类对象,但是这时候就出现了一个问题,当调用Roar方法时,调用的到底是基类的Roar还是派生类的Roar呢?编译器如何智能的做倒这一点呢?在这里我先不解释了,等到讲C++的重要性质时再详述!