| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5452 人关注过本帖, 2 人收藏
标题:[原创]C++中的指针(一) 简单指针
只看楼主 加入收藏
woodhead
Rank: 3Rank: 3
等 级:新手上路
威 望:9
帖 子:1124
专家分:0
注 册:2005-7-18
收藏
得分:0 
支持一个,我也试了试
[CODE]#include<iostream>
#include<fstream>
using namespace std;

class A{public: virtual void a(){}};
class B : public A {};
class C : public A {};
class D{public: virtual void d(){}};
class E : public B, public C, public D {};

int main()
{
C c;
C *pc = dynamic_cast<C*>((D*)&c);
if(pc==0)
cout<<"null"<<endl;
system("pause");
return 0;
}[/CODE]

用gcc的编译器,结果也是null。

我想,类型识别可能是 按照指针或引用的类型,把((D*)&c)看做D类型的指针,不管他以前是什么类型的
C和D的类型没有关系,如果从D到C的dynamic_cast应该是不行的。



2006-08-19 09:22
穆扬
Rank: 1
等 级:禁止发言
帖 子:1910
专家分:0
注 册:2006-6-1
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽

2006-08-19 10:25
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
收藏
得分:0 
以下是引用woodhead在2006-8-19 9:22:01的发言:
C *pc = dynamic_cast<C*>((D*)&c);

用gcc的编译器,结果也是null。

我想,类型识别可能是 按照指针或引用的类型,把((D*)&c)看做D类型的指针,不管他以前是什么类型的
C和D的类型没有关系,如果从D到C的dynamic_cast应该是不行的。


问题在于
C *pc = dynamic_cast<C*>((D*)&e);
这里得到的结果不是NULL,也就是说,见了无关的指针,就先假设是crosscast,然后查指向的object的类型。e类型的是crosscast,所以非NULL,难道c类型是自己的类型,所以不是crosscast所以是NULL?


http://myajax95./
2006-08-19 12:07
woodhead
Rank: 3Rank: 3
等 级:新手上路
威 望:9
帖 子:1124
专家分:0
注 册:2005-7-18
收藏
得分:0 
我上面又说错了哈,识别的时候会查看指针指向对象的具体类型,说是典型的实现方法是在类对象中加入类型信息,通过查type_info来确定,对于这些机制我了解的很少。

个人想法:
(D*)&c 和(D*)&e的转换不一样,(D*)&c是强制转换,(D*)&e是向上的安全转换,就跟D *pd = &e一样?
是不是(D*)&c以后C类型的信息丢失了,他最终查不出是C类型的。


2006-08-19 12:58
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
收藏
得分:0 
以下是引用woodhead在2006-8-19 12:58:16的发言:
我上面又说错了哈,识别的时候会查看指针指向对象的具体类型,说是典型的实现方法是在类对象中加入类型信息,通过查type_info来确定,对于这些机制我了解的很少。

个人想法:
(D*)&c 和(D*)&e的转换不一样,(D*)&c是强制转换,(D*)&e是向上的安全转换,就跟D *pd = &e一样?
是不是(D*)&c以后C类型的信息丢失了,他最终查不出是C类型的。

写成下面的样子得到的结果一样:
D* pc = (D*)&c, pe = (D*)&e; //作完这步两个指针还都合法,然后作dynamic_cast,结果一样。
可能是dynamic_cast把这种前面传来的C D这种不匹配的转换直接干掉了。我再查查ISO C++ Standard 10.3去。不过VC2003上的结果和gcc/VC2005不一样,看来是个错误。


http://myajax95./
2006-08-19 13:16
woodhead
Rank: 3Rank: 3
等 级:新手上路
威 望:9
帖 子:1124
专家分:0
注 册:2005-7-18
收藏
得分:0 
C c;
D *pd = (D*)&c;
if(typeid( *pd ) == typeid(C) )
cout<<"same"<<endl;

是same,搞不清了,

觉得dynamic_cast主要是用在向下转换和交叉上的,其他的

2006-08-19 15:30
crystalthe
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2006-9-11
收藏
得分:0 

刚刚开始学习编程,也是刚刚来到这个论坛,感觉确实很好。

[此贴子已经被作者于2006-9-11 20:18:55编辑过]

2006-09-11 20:16
tancui
Rank: 1
等 级:新手上路
威 望:1
帖 子:63
专家分:0
注 册:2006-11-19
收藏
得分:0 

什么与什么呀,不懂

2006-12-19 21:03
peswe
Rank: 1
等 级:新手上路
帖 子:197
专家分:0
注 册:2006-11-22
收藏
得分:0 

哎,我也是呢,还没开始看就已经晕过去了!!!!


C斗士~~~fighting!!!!
2006-12-19 21:28
lc2610624
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2006-12-23
收藏
得分:0 
同感......
2006-12-23 21:21
快速回复:[原创]C++中的指针(一) 简单指针
数据加载中...
 
   



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

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