dynamic_cast(expression)出错

tesling 2005-10-13 02:58:34
#include <iostream>
using namespace std;
class employee
{
public:
virtual void salary(){cout<<"in salary of employee\n";}
};
class programmer : public employee
{
public:
void salary(){cout<<"in salary of programmer\n";};
void bonus(){cout<<"in bonus of programmer\n";}
};
class company
{
public:
void payroll(employee* pe);
};

int main(int argc, char* argv[])
{
company IBM;
employee *pe=NULL;
pe = new employee;
IBM.payroll(pe);
delete pe;
return 0;
}
void company::payroll(employee *pe)
{
programmer *pm = dynamic_cast<programmer*>(pe);//程序运行到这一句不正常终止,为什么,对指针转换,就算不成功也应该是使pm=null啊,怎么好像我运行是抛出异常
if ( pm )
{
pm->bonus;
}
else
{
pm->salary();
}
}
...全文
150 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
xlsue 2005-10-13
  • 打赏
  • 举报
回复
原来楼主用的是VC6啊!
tesling 2005-10-13
  • 打赏
  • 举报
回复
多谢deping_chen(小平)
解决了
选择Project->settings->c/c++->category->c++ language,将Enable Run-Time Type Infomation(RTTI)选中再编译就可以了
deping_chen 2005-10-13
  • 打赏
  • 举报
回复
默认的编译器选项不产生RTTI信息。
deping_chen 2005-10-13
  • 打赏
  • 举报
回复
if ( pm )
{
pm->bonus;
}
else
{
pm->salary();
}
这个代码表示,如果pm为0,你死定了。

programmer *pm = dynamic_cast<programmer*>(pe);
如果要使用运行时类型识别,要设置/GR编译器选项。
tesling 2005-10-13
  • 打赏
  • 举报
回复
但是到底应该怎么改呢?
为什么到这句
programmer *pm = dynamic_cast<programmer*>(pe);
就出错?
xlsue 2005-10-13
  • 打赏
  • 举报
回复
楼主,I服了you!
tesling 2005-10-13
  • 打赏
  • 举报
回复
sorry,写错了,应该是
if ( pm )
{
pm->bonus;
}
else
{
pe->salary();
}
单步执行的时候,就是到那一步报错:
unhandled exception in salary.exe
好像是说抛出了一个未知的异常吧
后面都没办法执行。
xlsue 2005-10-13
  • 打赏
  • 举报
回复
楼主的思维是C是思维啊!
Beover1984 2005-10-13
  • 打赏
  • 举报
回复
怎么改楼主应该知道了吧
Beover1984 2005-10-13
  • 打赏
  • 举报
回复
int main(int argc, char* argv[])
{
company IBM;
employee *pe=NULL;
pe = new employee; //你这里创建的对象类型是employee
IBM.payroll(pe);
delete pe;
return 0;
}
void company::payroll(employee *pe)
{
programmer *pm = dynamic_cast<programmer*>(pe);//pe是一个指向employee对象的指针,而你要把它转换成programmer指针时会失败也就是pm为0;
if ( pm )
{
pm->bonus;
}
else
{
pm->salary(); //转换失败后pm为0,不指向任何对象!所以是在这里出错的
}
}
格兰特杨 2005-10-13
  • 打赏
  • 举报
回复
我确实没有调试你的程序,呵呵。不过你的检测...
如果pm是NULL,那么无论bonus()还是salary()方法都会完蛋的。

按我说的试试再说,好不好(:
xlsue 2005-10-13
  • 打赏
  • 举报
回复
同意 bisc_sunny(总是当时携手处,游遍芳丛)的
tesling 2005-10-13
  • 打赏
  • 举报
回复
to bisc_sunny(总是当时携手处,游遍芳丛)
我在使用pm前已经检测了是否转换成功。
if ( pm )
{
pm->bonus;
}
else
{
pm->salary();
}
这里的if语句不就是检测pm是否为空么。
就是在我说的那一句终止的,我还会一点基本的调试,呵呵
格兰特杨 2005-10-13
  • 打赏
  • 举报
回复
哥们,你传入的就是父类的实例(employee)啊。怎么动态转到子类实例呢。
我相信不是在那里不正常终止,而是在pm->salary()终止的。

因为pm是空指针 - 从employee转不到programmer啊。
把 pe=new employee 改成 pe = new programmer试试。

64,664

社区成员

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

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