C++ 面试题 目录

C++ 中 dynamic_cast 和 typeid 的用法?

推荐答案

-- -------------------- ---- -------
-------- ----------
-------- ----------

----- ---- -
-------
    ------- ------- --
--

----- ------- - ------ ---- ---

--- ------ -
    ----- ------- - --- --------

    -- -- ------------ ------
    -------- ---------- - --------------------------------
    -- ------------ -
        --------- -- ------------ ------------ -- ----------
    - ---- -
        --------- -- ------------ -------- -- ----------
    -

    -- -- ------ ------
    --------- -- ----- -- -------- - -- ----------------------- -- ----------
    --------- -- ----- -- ----------- - -- -------------------------- -- ----------

    ------ --------
    ------ --
-

本题详细解读

dynamic_cast 的用法

dynamic_cast 是 C++ 中用于在继承层次结构中进行类型转换的操作符。它主要用于将基类指针或引用安全地转换为派生类指针或引用。dynamic_cast 在运行时检查转换的有效性,如果转换不合法,它会返回 nullptr(对于指针)或抛出 std::bad_cast 异常(对于引用)。

  • 适用场景dynamic_cast 通常用于多态类型(即包含虚函数的类)的向下转型(从基类指针或引用转换为派生类指针或引用)。
  • 注意事项dynamic_cast 只能用于具有虚函数的类,因为它依赖于运行时类型信息(RTTI)。

typeid 的用法

typeid 是 C++ 中用于获取对象类型信息的操作符。它返回一个 std::type_info 对象,该对象包含类型的名称等信息。

  • 适用场景typeid 通常用于在运行时确定对象的实际类型,特别是在多态场景下。
  • 注意事项typeid 也可以用于非多态类型,但在多态类型上使用时,它会返回对象的实际派生类型。

代码解析

  1. Base 类:定义了一个基类 Base,并为其添加了一个虚析构函数,以确保 Base 类是多态的。
  2. Derived 类:定义了一个派生类 Derived,继承自 Base
  3. dynamic_cast:在 main 函数中,使用 dynamic_castBase* 类型的指针 basePtr 转换为 Derived* 类型的指针 derivedPtr。如果转换成功,derivedPtr 将指向 Derived 对象,否则返回 nullptr
  4. typeid:使用 typeid 获取 basePtrderivedPtr 所指向对象的实际类型,并输出类型名称。

通过这段代码,可以清楚地看到 dynamic_casttypeid 在多态类型中的应用。

纠错
反馈