dynamic_cast?

qwertasdfg123 2004-06-08 03:29:05
代码如下:

#include <iostream>

struct A
{
public:
virtual void foo(){}
};

class B:public A{};

class C:public A{};

int main()
{
A *pa=new C;

B *pb = dynamic_cast<B*>(pa);// pb为什么为null。
if(!pb)
std::cout << "null" << std::endl;
else
pb->foo();

return 0;
}

我使用g++编译,然后执行,没有错误。可是使用vc编译后执行却是非法。
why?
...全文
211 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
photnman 2004-06-09
  • 打赏
  • 举报
回复
dynamic_cast一般是用来检测一个基类的指针指向的是不是一个特定的子类型的对象
实际上dynamic_cast使用RITT信息在程序运行的时候检查对象的类型
e.g
#include "stdafx.h"
#include <iostream>
//////////////////////////////////////////////////////////////////////////////////////
class A
{
public:
virtual void foo(){
printf("class A\n");
}
};

class B:public A{
void foo(){
printf("class B\n");
}
};
//////////////////////////////////////////////////////////////////////////////////////
int main()
{
B b;
A *a; //pd看起来指向的类型是A* ,实际上指向的是派生出来的B
a = &b;

B* p = dynamic_cast<B*>(a);
if(p) //如果转换成功
a->foo();
return 0;
}
bluejugar 2004-06-09
  • 打赏
  • 举报
回复
推荐你看下<<The Design and Evolution of C++>>,Bjarne Stroustrup.第14章,强制.
tuhui 2004-06-08
  • 打赏
  • 举报
回复
如果pa指向的B类对象或B的派生类对象,
那么B *pb = dynamic_cast<B*>(pa);
pb不为NULL并且和pa指向同一对象
xjp6688 2004-06-08
  • 打赏
  • 举报
回复
up
angelo23 2004-06-08
  • 打赏
  • 举报
回复
假设B和C都继承于A,而且有多态行为
那么
A *p;
//... (在此期间,p可能通过赋值,指向B类或C类对象)
那么这之后p倒底指向那个类的对象呢?
shangrilaboy 2004-06-08
  • 打赏
  • 举报
回复
A *pa=new A; // 改为A——>改为B应该就可以了。

B *pb = dynamic_cast<B*>(pa);// pb还是等于null。为什么
qwertasdfg123 2004-06-08
  • 打赏
  • 举报
回复
如此说来,dynamic_cast没有起到什么作用?

按道理来讲,它是动态的转换一个指针到另一个指针。

它如何会转换错误呢?

谢谢了。

angelo23 2004-06-08
  • 打赏
  • 举报
回复
还是因为运行时pa此刻指向的并不是B类对象啊~~
btw,刚才说的和对象模型有关有误,我弄错了。
qwertasdfg123 2004-06-08
  • 打赏
  • 举报
回复

A *pa=new A; // 改为A

B *pb = dynamic_cast<B*>(pa);// pb还是等于null。为什么
Wolf0403 2004-06-08
  • 打赏
  • 举报
回复
*pa 是一个 C,不是一个 B 啊,当然是 NULL 了,要不 RTTI 干吗用?
angelo23 2004-06-08
  • 打赏
  • 举报
回复
因为你的pa现在指向一个C类对象啊,从C*到B*的转换失败,当然pb等于0了
虽然B和C都继承于A,但是B*和C*不可以互相转换。具体原因和对象模型有关
qwertasdfg123 2004-06-08
  • 打赏
  • 举报
回复
谢谢!我把RTTI打开了,但是执行
B *pb = dynamic_cast<B*>(pa);后
pb怎么是NULL呢?
angelo23 2004-06-08
  • 打赏
  • 举报
回复
-GR
TopCat 2004-06-08
  • 打赏
  • 举报
回复
VC请把RTTI选项打开。

65,186

社区成员

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

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