dynamic_cast疑点

blueskywind6 2010-05-12 10:16:20
#include <iostream>
using namespace std;
class A
{
public:
int i;
virtual void show()
{
cout<<"class A"<<endl;
}
A()
{
i=1;
}
};

class B:public A
{
public:
int j;
void show()
{
cout<<"class B"<<endl;
}
B()
{
j=2;
}
};

int _tmain(int argc, _TCHAR* argv[])
{
A a,*pa;
bool bad;
pa=&a;
try
{
bad=true;
B &rb=dynamic_cast<B &>(*pa);
}
catch(bad_cast)
{
cout<<"Reference failed from A & to B &"<<endl;
bad=true;
}
if(!bad)
{
B &rb=dynamic_cast<B &>(*pa);
rb.show();
}
system("PAUSE");
return 0;
}
程序输出结果是:Reference failed from A & to B &
不解,为什么会转换失败呢?请各位仁兄指教
...全文
142 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
linsen_519 2010-05-12
  • 打赏
  • 举报
回复
dynamic_cast 不能把属于父类的指针转化成子类指针
只有当父类的指针指向了子类的空间时才能转换成功哦

加上 pa=new B;再试一下
sixbusy 2010-05-12
  • 打赏
  • 举报
回复
dynamic_cast 适用于 有继承关系的 父类指针箱子类转化的!
reinterpret_cast 可用户任何类型的转化,但自己要负责安全性!
pengzhixi 2010-05-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 blueskywind6 的回复:]
引用 1 楼 akirya 的回复:
因为pa指向的是A对象不是B对象,所以不能成功

A是B的基类啊
[/Quote]

你对dynamic_cast转型没弄清楚,只有当基类对象的指针确实是指向派生类对象的时候那么在向下转换才会成功(才能转换成派生类指针)。否则失败。
AlanBruce 2010-05-12
  • 打赏
  • 举报
回复
UP

UP
fangligen 2010-05-12
  • 打赏
  • 举报
回复
dynamic_cast < type-id > ( expression )
该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、类的引用或者void *;
wesleyluo 2010-05-12
  • 打赏
  • 举报
回复
dynamic_cast是能进行安全的强类型转换的,但是它是有限制的。
它只能进行基类的继承或派生类到基类的类型转换;
如果进行逆向转换时就会出错,此时如果基类存在需函数就不会出错,但出现如下两种返回结果:
如果是指针返回NULL,如果是引用则会抛出bad_cast的错误。
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 blueskywind6 的回复:]

引用 1 楼 akirya 的回复:
因为pa指向的是A对象不是B对象,所以不能成功

A是B的基类啊
[/Quote]
建议仔细看书,看看怎么解释
blueskywind6 2010-05-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 akirya 的回复:]
因为pa指向的是A对象不是B对象,所以不能成功
[/Quote]
A是B的基类啊
blueskywind6 2010-05-12
  • 打赏
  • 举报
回复
[Quote=引用楼主 blueskywind6 的回复:]
#include <iostream>
using namespace std;
class A
{
public:
int i;
virtual void show()
{
cout<<"class A"<<endl;
}
A()
{
i=1;
}
};

class B:public A
{
public:
int j;
void show()
{
……
[/Quote]

但是他们之间是 基类与派生类的关系啊
pengzhixi 2010-05-12
  • 打赏
  • 举报
回复
因为pa指向的不是B类型的对象转换失败是正常的
  • 打赏
  • 举报
回复
因为pa指向的是A对象不是B对象,所以不能成功
暗黑帝国 2010-05-12
  • 打赏
  • 举报
回复
dynamic_cast该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、类的引用或者void *;
  如果 type-id是类指针类型,那么expression也必须是一个指针,如果type-id是一个引用,那么expression也必须是一个引用。

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧