C++,dynamic_cast关键字怎么用

谁学逆向工程 2010-01-26 11:09:42
#include "iostream"
using namespace std;
enum TYPE{HORSE,PEGASUS};
class horse
{
public:
virtual void gallop(){cout<<"galloping..."<<endl;}
};
class pegasus:public horse
{
public:
virtual void fly(){cout<<"I can fly! I can fly! I can fly! "<<endl;}
};
const int numberhorses=5;
void main()
{
horse * ranch[numberhorses];
horse * phorse; int choice,i;
for(i=0;i<numberhorses;i++)
{
cout<<"(1)horse (2)pegasus:";cin>>choice;
if(choice==2)
phorse=new pegasus;
else
phorse= new horse;
ranch[i]=phorse;
}
cout<<endl;
for(i=0;i<numberhorses;i++)
{
pegasus * ppeg=dynamic_cast<pegasus*>(ranch[i]);
if(ppeg!=NULL)
ppeg->fly ();
else
cout<<"just a horse"<<endl;
delete ranch[i];
}
}

==================================================================

1、请讲解红体字的含义

2、这段代码在VC6中可以编译。但运行时程序崩溃。什么原因
...全文
473 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovesi3344 2010-01-26
  • 打赏
  • 举报
回复
dynamic_cast<>可移植性不高
慎用
昵称很不好取 2010-01-26
  • 打赏
  • 举报
回复
dynamic_cast主要用于运行时绑定,程序中将父类指针转化为子类指针,如果转换失败,则子类指针为NULL,我在code::blocks里运行下,你的程序,结果如下:
(1)horse (2)pegasus:1
(1)horse (2)pegasus:1
(1)horse (2)pegasus:1
(1)horse (2)pegasus:1
(1)horse (2)pegasus:2

just a horse
just a horse
just a horse
just a horse
I can fly! I can fly! I can fly!
冻结 2010-01-26
  • 打赏
  • 举报
回复
2005试一试
小小攻城师 2010-01-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 thefirstz 的回复:]
dynamic_cast主要用于运行时绑定,程序中将父类指针转化为子类指针,如果转换失败,则子类指针为NULL,我在code::blocks里运行下,你的程序,结果如下:
(1)horse (2)pegasus:1
(1)horse (2)pegasus:1
(1)horse (2)pegasus:1
(1)horse (2)pegasus:1
(1)horse (2)pegasus:2

just a horse
just a horse
just a horse
just a horse
I can fly! I can fly! I can fly!

[/Quote]
正解,最简单的理解就是在类动态帮顶的时候强制转换指针类型,可以把父类指针转化为子类指针
小小攻城师 2010-01-26
  • 打赏
  • 举报
回复
该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、类的引用或者void *;
  如果type-id是类指针类型,那么expression也必须是一个指针,如果type-id是一个引用,那么expression也必须是一个引用。
  dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。
  在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;
  在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。
  class B{
  public:
  int m_iNum;
  virtual void foo();
  };
  class D:public B{
  public:
  char *m_szName[100];
  };
  void func(B *pb){
  D *pd1 = static_cast<D *>(pb);
  D *pd2 = dynamic_cast<D *>(pb);
  }
  在上面的代码段中,如果pb指向一个D类型的对象,pd1和pd2是一样的,并且对这两个指针执行D类型的任何操作都是安全的;
  但是,如果pb指向的是一个B类型的对象,那么pd1将是一个指向该对象的指针,对它进行D类型的操作将是不安全的(如访问m_szName),
  而pd2将是一个空指针。
  另外要注意:B要有虚函数,否则会编译出错;static_cast则没有这个限制。
  这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表(
  关于虚函数表的概念,详细可见<Inside c++ object model>)中,只有定义了虚函数的类才有虚函数表,
  没有定义虚函数的类是没有虚函数表的。
  另外,dynamic_cast还支持交叉转换(cross cast)。如下代码所示。
  class A{
  public:
  int m_iNum;
  virtual void f(){}
  };
  class B:public A{
  };
  class D:public A{
  };
  void foo(){
  B *pb = new B;
  pb->m_iNum = 100;
  D *pd1 = static_cast<D *>(pb); //compile error
  D *pd2 = dynamic_cast<D *>(pb); //pd2 is NULL
  delete pb;
  }
  在函数foo中,使用static_cast进行转换是不被允许的,将在编译时出错;而使用 dynamic_cast的转换则是允许的,结果是空指针。
课程目标本课程详细讲解了C++的所有关键字,包括C++11和C++20新增的关键字和语言特性适用人群本课程并非零基础,适合有C语言基础,尤其是学过嵌入式linux核心课程的《C语言高级专题》的同学。课程简介《跟朱老师从C高级到征服C++》属于系列课程《朱有鹏老师热门编程语言全解》的第一部分,主要针对C++语言完全学习。本课程可以看做是嵌入式linux核心课程中《C语言高级专题》课程的延续,在学好了C语言前提下继续深度学习C++语言。整个课程共分为5部分。涵盖了C++基础语法和使用,面向对象,STL与泛型,Boost库和设计模式,C++编程优化技巧等非常广泛的内容,是市面上非常缺少的深度完整学习C++,培养编程技能和修养的一套系列学习课程。整个课程预计2020年底前录制完成,总时长预计150-200小时。朱老师C++第1部分-从C到C++朱老师C++第2部分-C++和面向对象朱老师C++第3部分-STL等高阶话题朱老师C++第4部分-Boost库和设计模式朱老师C++第5部分-C++编程优化课程特色*完全零基础,降低学习门槛。*深入浅出,通俗易懂。不怕学不会,就怕你不学习。*思路清晰、语言风趣,对着视频看也不会想睡觉······*视频 + 文档 + 练习题 + 答疑,全方位保证学习质量。*基础知识 + 思路引导的教学方式,授之以鱼更授之以渔。*系列课程。本教程只是入门篇,后续还有更多更精彩视频更新中。

15,440

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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