首页 新闻 会员 周边 捐助

C/C++ 指针问题

0
悬赏园豆:5 [已解决问题] 解决于 2011-11-02 20:03

既然说C/C++中的类型和对象的指针都是同一个指针类型(pointer),那么还有必要进行指针之间的转换么?为什么不直接赋值,改变他们的指向不就可以了么?也就是问:基类的指针和派生类的指针到底有什么本质的区别?为什么老是看到书上面要把他们的指针转换来转换去呢?

清逸居的主页 清逸居 | 初学一级 | 园豆:194
提问于:2011-10-22 10:03
< >
分享
最佳答案
1

虽然指针本身是一个类型的,但所指向并不是一个类型。

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.

 

收获园豆:5
影一辉 | 菜鸟二级 |园豆:205 | 2011-11-01 16:36
其他回答(3)
0

多态是通过这个体现的,这个文章写的还行 http://hi.baidu.com/lml12377/blog/item/566fa6f8efa51209d8f9fd78.html

2012 | 园豆:21645 (高人七级) | 2011-10-23 13:53
0

涉及到内存布局问题,去找一个深入理解C++对象模型就懂了

egmkang | 园豆:-734 (初学一级) | 2011-10-24 15:23
0

“只要理解一点,那就是无论是基类指向派生类还是派生类指向基类,重点就是哪个类的指针就调用哪个类的方法,而输出的是指针指向的对象。”

如楼上大虾所述,关键还是要看指针指向的真正实体对象。

如果派生类指针(pDeriver)指向基类实体对象,还要用派生类指针(pDeriver)调用派生类专有成员函数,并且改专有成员函数中引用了派生类专有的字段数据,运行时会跳出异常。

以上所述只是表象,个人认为关键还是在于面向对象多态的实现。

C++是怎么实现面向对象的多态的呢?

这里做一些简单的剖析(不一定完全正确,由于工作比较忙,没有太多的时间查找资料,请见谅!)

在有定义虚函数类实例化过程中,编译器会给该对象创建一份虚函数表,对象中有一个固定字段指向该虚函数表,而且虚函数中存放虚函数顺序在运行时是固定的(下一次运行时顺序可能不一样)。这样,当使用指针调用某个虚函数是,先会通过虚函数表指针找到虚函数表所在位置,能后依据要调用的函数序号找到函数指针,这样就可以正确调用指针所指真正的实体对象所包含的虚函数了,从而实现OO的多态。

这样就好把握基类和派生类指针的问题了,也好理解把基类对象显示转换为派生类对象是有风险的。

胡屯 | 园豆:714 (小虾三级) | 2011-11-02 11:33
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册