为什么dynamic_cast存在?

时间:2012-02-05 16:28:43

标签: c++ casting dynamic-cast static-cast

  

可能重复:
  Regular cast vs. static_cast vs. dynamic_cast

我通过这个问题了解了static_cast是如何工作的。 Why is it important to use static_cast instead of reinterpret_cast here?

但是如果static_cast确实知道类的继承关系,为什么dynamic_cast存在呢?什么时候我们必须使用dynamic_cast?

2 个答案:

答案 0 :(得分:2)

我将发布一个简单的例子,说明它们的不同之处:

struct foo { virtual void fun() {} };
struct bar : foo {};
struct qux : foo {};

foo* x = new qux;
bar* y = static_cast<bar*>(x);
bar* z = dynamic_cast<bar*>(x);
std::cout << y; // prints address of casted x
std::cout << z; // prints null as the cast is invalid

如果我理解正确,static_cast只知道它所投射的类型。另一方面,dynamic_cast知道要转换的类型以及要转换的类型。

答案 1 :(得分:-1)

如果类型是指针,则

dynamic_cast返回NULL,如果类型是引用类型则抛出异常。因此,dynamic_cast可用于检查对象是否属于给定类型,static_cast不能(您最终会得到无效值)。

此外,在某些情况下static_cast是不可能的,例如具有多重继承:

class Base {};
class Foo : public Base { ... };
class Bar : public Base { ... };
class FooBar: public virtual Foo, public virtual Bar { ... };

FooBar a;
Foo & foo1 = static_cast<Foo &>(a); // Illegal, wont compile
Foo & foo2 = dynamic_cast<Foo &>(a); // Legal