我通过这个问题了解了 static_cast 的工作原理。 为什么在这里使用 static_cast 而不是 reinterpret_cast 很重要?
但是如果 static_cast 确实知道类的继承关系,为什么 dynamic_cast 存在?我们什么时候必须使用dynamic_cast?
我通过这个问题了解了 static_cast 的工作原理。 为什么在这里使用 static_cast 而不是 reinterpret_cast 很重要?
但是如果 static_cast 确实知道类的继承关系,为什么 dynamic_cast 存在?我们什么时候必须使用dynamic_cast?
我将发布一个简单的示例来说明它们的不同之处:
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
如果类型是指针,则如果强制转换是不可能的,则返回 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