虽然指针本身是一个类型的,但所指向并不是一个类型。
32位下小端模式下:
char *p1; //*p1 = 0x 12
int *p2; //*p2 = 0x 1234
p1,p2本身都是4字节类型的,这是一样的。
p1 指向的是1字节的char类型;
p2 指向的是4字节的int类型。
如果有这句:p1 = (char*)p2;
作用是,强制4字节指针转换成1字节指针,并赋给p1,
这样, 原来*p1 = 0x 12, 转换之后*p1 =0x 34.
涉及到内存布局问题,去找一个深入理解C++对象模型就懂了
“只要理解一点,那就是无论是基类指向派生类还是派生类指向基类,重点就是哪个类的指针就调用哪个类的方法,而输出的是指针指向的对象。”
如楼上大虾所述,关键还是要看指针指向的真正实体对象。
如果派生类指针(pDeriver)指向基类实体对象,还要用派生类指针(pDeriver)调用派生类专有成员函数,并且改专有成员函数中引用了派生类专有的字段数据,运行时会跳出异常。
以上所述只是表象,个人认为关键还是在于面向对象多态的实现。
C++是怎么实现面向对象的多态的呢?
这里做一些简单的剖析(不一定完全正确,由于工作比较忙,没有太多的时间查找资料,请见谅!)
在有定义虚函数类实例化过程中,编译器会给该对象创建一份虚函数表,对象中有一个固定字段指向该虚函数表,而且虚函数中存放虚函数顺序在运行时是固定的(下一次运行时顺序可能不一样)。这样,当使用指针调用某个虚函数是,先会通过虚函数表指针找到虚函数表所在位置,能后依据要调用的函数序号找到函数指针,这样就可以正确调用指针所指真正的实体对象所包含的虚函数了,从而实现OO的多态。
这样就好把握基类和派生类指针的问题了,也好理解把基类对象显示转换为派生类对象是有风险的。