请教一个关于用dynamic_cast转换的问题?

leechildren 2003-08-30 04:16:28
dynamic_cast能被用于安全地沿着类的继承关系向下进行类型转换,也就是说, 能用dynamic_cast把指向基类的指针或引用转换成指向其派生类或其兄弟类的指针或引用, 但不知道我写的一个小测试程序为什么会抛出异常? 希望各位大虾帮帮忙。


#include <iostream>
using namespace std;

class B
{
public:
virtual void print() { cout << " B class" << endl; }
};

class D1 : public B
{
public :
void print() { cout << " D1 class " << endl;}
};

class D2 : public B
{
public:
void print() { cout << " D2 class " << endl;}
};


void fn(D1 *ptr)
{
ptr->print();
}

int main()
{
B *pb = new B;
D1 d1;
D2 d2;

fn(&d1);
fn( dynamic_cast<D1*> (pb) ); // 请问为什么会抛出异常?
}
...全文
92 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
leechildren 2003-08-30
  • 打赏
  • 举报
回复
谢谢sevecol了, 我是在.net下编译的。
Wanix 2003-08-30
  • 打赏
  • 举报
回复
我也来晚了
lemonutzf 2003-08-30
  • 打赏
  • 举报
回复

来晚了
sevecol 2003-08-30
  • 打赏
  • 举报
回复
上面错了一句话
你将pb转化成D1的指针回失败,因为pb的对象是D1 ---改成 因为pb的对象是B
sevecol 2003-08-30
  • 打赏
  • 举报
回复
首先pb所指的对象是B
(B *pb=new B)
B是D1的基类,你将pb转化成D1的指针回失败,因为pb的对象是D1

正常的测试是这样的
B *pb=new D1;
这里pb的类型是B*,但是他指的对象是D1,这样就能安全的转换成D1*

还有一点,你是不是在VS2003下面编译的?如果是,需要打开一个编译开关./GR

64,645

社区成员

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

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