首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >类型转换C++

类型转换C++
EN

Stack Overflow用户
提问于 2009-11-08 02:27:25
回答 3查看 432关注 0票数 1

请参阅以下代码:

代码语言:javascript
运行
复制
void simple_dynamic_casts( )
{
  AB  ab;

  B*  bp  = (B*)&ab;  // cast needed to break protection
  A*  ap  = &ab;      // public derivation, no cast needed

  AB& abr = dynamic_cast<AB&>(*bp);  // succeeds

  ap = dynamic_cast<A*>(bp);         assert( ap != NULL );
  bp = dynamic_cast<B*>(ap);         assert( bp == NULL );
  ap = dynamic_cast<A*>(&abr);       assert( ap != NULL );
  bp = dynamic_cast<B*>(&abr);       assert( bp == NULL );
}

取自here的代码

这样行得通吗

代码语言:javascript
运行
复制
ap = &abr;

为什么代码在这里使用动态类型转换。我还没有尝试编译这段代码。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-11-08 02:46:00

他们使用dynamic_cast来展示它的功能。所以,这就是你“为什么”问题的答案。

否则,在该网页上给出的解释是不正确的。您尝试使用的资源要么严重过时,要么绑定到某个特定的、质量很差的编译器。“新兴的C++标准...”在页面的顶端是一个完全免费的页面。C++标准在11年前成为现实。(这意味着该站点通常不是C++的好资源,尤其是在dynamic_cast上,如果这正是您要寻找的。)

下面是它们的类定义

代码语言:javascript
运行
复制
class A          { public: virtual void f( ); };
class B          { public: virtual void g( ); };
class AB :       public virtual A, private B { };

演员阵容

代码语言:javascript
运行
复制
AB& abr = dynamic_cast<AB&>(*bp); // they say: succeeds

都不会成功。它将抛出bad_cast异常,因为B不是AB的公共基类。dynamic_cast不能用来破坏下播中的保护。

演员阵容

代码语言:javascript
运行
复制
bp = dynamic_cast<B*>(&abr);

甚至不会编译,因为非法的向上转换(破坏保护)在编译时甚至会被dynamic_cast拒绝(即代码格式错误)。请注意,在这种情况下,dynamic_cast并没有做什么特别的事情。对于向上转换,dynamic_cast等同于static_cast或完全不转换。上面的强制转换不会编译,因为B是一个私有基。作者似乎错误地假设在这种情况下dynamic_cast应该返回空指针。

至于ap = &abr -是的,它会工作的。只要AAB的公共基础,它就没有错。

票数 3
EN

Stack Overflow用户

发布于 2009-11-08 02:34:47

是。指向类的指针总是可以隐式转换为指向公共基类的指针;在本例中,您将从AB*转换为A*。允许使用dynamic_cast,但不是必需的。

这与第二次转换(A* ap = &ab;)没有什么不同。

代码使用dynamic_cast来说明它是如何工作的。

票数 1
EN

Stack Overflow用户

发布于 2009-11-08 02:37:12

为什么代码在这里使用动态类型转换。

dynamic_cast操作符允许您在运行时检查类型转换是否有效。如果不是,它将返回null (因此会调用assert() )。

会这样做吗

试试看..。:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1693959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档