请参阅以下代码:
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的代码
这样行得通吗
ap = &abr;
为什么代码在这里使用动态类型转换。我还没有尝试编译这段代码。
发布于 2009-11-08 02:46:00
他们使用dynamic_cast
来展示它的功能。所以,这就是你“为什么”问题的答案。
否则,在该网页上给出的解释是不正确的。您尝试使用的资源要么严重过时,要么绑定到某个特定的、质量很差的编译器。“新兴的C++标准...”在页面的顶端是一个完全免费的页面。C++标准在11年前成为现实。(这意味着该站点通常不是C++的好资源,尤其是在dynamic_cast
上,如果这正是您要寻找的。)
下面是它们的类定义
class A { public: virtual void f( ); };
class B { public: virtual void g( ); };
class AB : public virtual A, private B { };
演员阵容
AB& abr = dynamic_cast<AB&>(*bp); // they say: succeeds
都不会成功。它将抛出bad_cast
异常,因为B
不是AB
的公共基类。dynamic_cast
不能用来破坏下播中的保护。
演员阵容
bp = dynamic_cast<B*>(&abr);
甚至不会编译,因为非法的向上转换(破坏保护)在编译时甚至会被dynamic_cast
拒绝(即代码格式错误)。请注意,在这种情况下,dynamic_cast
并没有做什么特别的事情。对于向上转换,dynamic_cast
等同于static_cast
或完全不转换。上面的强制转换不会编译,因为B
是一个私有基。作者似乎错误地假设在这种情况下dynamic_cast
应该返回空指针。
至于ap = &abr
-是的,它会工作的。只要A
是AB
的公共基础,它就没有错。
发布于 2009-11-08 02:34:47
是。指向类的指针总是可以隐式转换为指向公共基类的指针;在本例中,您将从AB*
转换为A*
。允许使用dynamic_cast
,但不是必需的。
这与第二次转换(A* ap = &ab;
)没有什么不同。
代码使用dynamic_cast
来说明它是如何工作的。
发布于 2009-11-08 02:37:12
为什么代码在这里使用动态类型转换。
dynamic_cast
操作符允许您在运行时检查类型转换是否有效。如果不是,它将返回null
(因此会调用assert()
)。
会这样做吗
试试看..。:)
https://stackoverflow.com/questions/1693959
复制相似问题