为什么存在dynamic_cast?

发布于 2025-01-02 06:14:06 字数 496 浏览 0 评论 0原文

可能的重复:
常规演员表、static_cast 与dynamic_cast

我了解了 static_cast 如何进行通过这个问题起作用。 为什么它很重要在这里使用static_cast而不是reinterpret_cast?

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

Possible Duplicate:
Regular cast vs. static_cast vs. dynamic_cast

I learned how static_cast works by this question.
Why is it important to use static_cast instead of reinterpret_cast here?

But if static_cast does knows classes' inheritance-relationship, why does dynamic_cast exist? And when do we must use dynamic_cast?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

口干舌燥 2025-01-09 06:14:06

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

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 知道要强制转换的类型以及要强制转换的类型。

I'll post a simple example of how they differ:

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

If I understand correctly, static_cast only knows the type it's casting to. dynamic_cast on the other hand knows type being cast, along with the type being cast to.

肥爪爪 2025-01-09 06:14:06

如果类型是指针,则如果无法进行强制转换,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

dynamic_cast returns NULL if the cast is impossible if the type is a pointer (throws exception if the type is a reference type). Hence, dynamic_cast can be used to check if an object is of a given type, static_cast cannot (you will simply end up with an invalid value).

Also, in some cases static_cast is not possible, e.g. with multiple inheritance:

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文