【问题标题】:Why does dynamic_cast exist? [duplicate]为什么dynamic_cast存在? [复制]
【发布时间】:2012-02-27 09:10:04
【问题描述】:

可能重复:
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?

【问题讨论】:

  • 我忘记了细节,但请注意您的static_cast 示例不涉及虚拟。 dynamic_cast 专门用于虚拟向下转换。
  • @Pubby 是的。但是即使示例有一个虚拟方法,static_cast 也可以正常工作,是我误解了吗?
  • Any 类型的转换在 C++ 中应该是一种罕见的事件,动态转换可能是其中最罕见的事件之一,但与大多数神秘的 C++ 功能一样,当您需要它,你真的需要它。
  • 它与虚方法没有任何关系。您有一个指向派生类对象的 Base* 指针。并且喜欢访问该派生类的成员。需要强制转换,但是您如何知道强制转换是有效的以及对象实际上 是预期的派生类类型? dynamic_cast 告诉你,必须启用 RTTI。

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


【解决方案1】:

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

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

【讨论】:

  • 这显示了what,但 OP 正在寻找why
【解决方案2】:

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

【讨论】:

  • 这是不正确的。 static_cast 到虚拟基地是合法的;反之则违法。
猜你喜欢
  • 2014-10-25
  • 2013-04-26
  • 1970-01-01
  • 2012-03-17
  • 2020-12-11
  • 2023-03-12
  • 1970-01-01
  • 2019-09-27
  • 2010-10-26
相关资源
最近更新 更多