关于c ++:为什么dynamic_cast存在?

Why does dynamic_cast exist?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Regular cast vs. static_cast vs. dynamic_cast

我通过这个问题了解了静态演员表是如何工作的。为什么在这里使用静态u cast而不是重新解释u cast很重要?

但是,如果静态类型转换确实知道类的继承关系,那么为什么存在动态类型转换?我们什么时候必须使用动态铸造?


我将发布一个简单的例子,说明它们的区别:

1
2
3
4
5
6
7
8
9
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知道被转换的类型以及被转换到的类型。


如果类型是指针,则dynamic_cast返回空值(如果类型是引用类型,则引发异常)。因此,可以使用dynamic_cast来检查对象是否为给定类型,而static_cast不能(您只会得到一个无效的值)。

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

1
2
3
4
5
6
7
8
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