标题:[求助]关于函数指针
只看楼主
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
得分:0 
以下是引用myajax95在2006-8-18 11:37:44的发言:
函数指针和函数类型其实是相关的。
class A {public: virtual void a(){}};
class B {public: virtual void b(){}};
class C : public A, public B{};
int main()
{
C c, *pc = &c;
B *pb = pc; //这里只是浅拷贝,只是pb==pc;并不表示&pb==&pc;
return 0;
}

debug一下会发现,pb的地址并不是pc的地址。


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-08-18 13:32
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
得分:0 
不是潜考贝,是implicit conversion,和dynamic_cast的结果一样。拿到的是c中class B的sub object。由于class C是先继承的A,再继承的B,所以B在c中的sub object的地址不是第一个。所以(void*)pb != (void*)pc

http://myajax95./
2006-08-18 13:43
aogun
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:638
专家分:0
注 册:2006-4-5
得分:0 
以下是引用myajax95在2006-8-18 13:43:58的发言:
不是潜考贝,是implicit conversion,和dynamic_cast的结果一样。拿到的是c中class B的sub object。由于class C是先继承的A,再继承的B,所以B在c中的sub object的地址不是第一个。所以(void*)pb != (void*)pc

这里你说的指针类型和指针值相关的原因只是编译器为了实现多重继承的隐藏做法,如果pb等于pc才有问题,偏移地址都乱了,怎么都不可能正常访问B的,在继承的情况下每个子类多对应的对象都有自己的this指针
我认为B *pb = pc;中pb不等于pc不过是c++为了实现多重继承而采用了类似实现:B *pb = (B*)((char*)pc + sizeof(A));
就如我之前说的,你直接给我void类型的指针,但是只要告诉我指向的对象是什么类的,不用指针类型,我也可以用上面的语句取得B类的指针地址
当然,我也不是说指针类型不重要


世界上总共有 10 种人,一种懂得什么是二进制 ,一种不懂。
2006-08-18 14:24
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
得分:0 
一般是这样的,但是在dynamic_cast中upcast的时候是不检查指向的对象的类型的,只检查指针的类型。downcast和crosscast检查指向的对象的类型。
这方面VC6和VC2003都有BUG。VC2005把这个问题给修正了。

[此贴子已经被作者于2006-8-18 15:47:28编辑过]


http://myajax95./
2006-08-18 14:40
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
得分:0 

这是今天刚刚学习的结果。理解不对之处还请指教。


http://myajax95./
2006-08-18 14:41
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
得分:0 

原来是这样啊,谢谢~


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-08-18 15:51
aogun
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:638
专家分:0
注 册:2006-4-5
得分:0 
没错,upcast是隐式转换的,如果检查对象类型的话估计效率是个问题了那么,ajax,你想说明的是什么?或者你是对于我的哪个观点有想法?

世界上总共有 10 种人,一种懂得什么是二进制 ,一种不懂。
2006-08-18 15:56
穆扬
Rank: 1
等 级:禁止发言
帖 子:1910
专家分:0
注 册:2006-6-1
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽

2006-08-18 23:07
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
得分:0 
以下是引用aogun在2006-8-18 15:56:31的发言:
没错,upcast是隐式转换的,如果检查对象类型的话估计效率是个问题了那么,ajax,你想说明的是什么?或者你是对于我的哪个观点有想法?

我还是另开一个贴子说吧。


http://myajax95./
2006-08-19 05:59
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
得分:0 
还是有不懂得地方,有空看看这个帖子的顶楼关于dynamic_cast的问题。
http://www.
多谢。

http://myajax95./
2006-08-19 07:19



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-82189-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.174019 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved