推荐答案
-- -------------------- ---- ------- -------- ---------- -------- ---------- ----- ---- - ------- ------- ------- -- -- ----- ------- - ------ ---- --- --- ------ - ----- ------- - --- -------- -- -- ------------ ------ -------- ---------- - -------------------------------- -- ------------ - --------- -- ------------ ------------ -- ---------- - ---- - --------- -- ------------ -------- -- ---------- - -- -- ------ ------ --------- -- ----- -- -------- - -- ----------------------- -- ---------- --------- -- ----- -- ----------- - -- -------------------------- -- ---------- ------ -------- ------ -- -
本题详细解读
dynamic_cast 的用法
dynamic_cast
是 C++ 中用于在继承层次结构中进行类型转换的操作符。它主要用于将基类指针或引用安全地转换为派生类指针或引用。dynamic_cast
在运行时检查转换的有效性,如果转换不合法,它会返回 nullptr
(对于指针)或抛出 std::bad_cast
异常(对于引用)。
- 适用场景:
dynamic_cast
通常用于多态类型(即包含虚函数的类)的向下转型(从基类指针或引用转换为派生类指针或引用)。 - 注意事项:
dynamic_cast
只能用于具有虚函数的类,因为它依赖于运行时类型信息(RTTI)。
typeid 的用法
typeid
是 C++ 中用于获取对象类型信息的操作符。它返回一个 std::type_info
对象,该对象包含类型的名称等信息。
- 适用场景:
typeid
通常用于在运行时确定对象的实际类型,特别是在多态场景下。 - 注意事项:
typeid
也可以用于非多态类型,但在多态类型上使用时,它会返回对象的实际派生类型。
代码解析
- Base 类:定义了一个基类
Base
,并为其添加了一个虚析构函数,以确保Base
类是多态的。 - Derived 类:定义了一个派生类
Derived
,继承自Base
。 - dynamic_cast:在
main
函数中,使用dynamic_cast
将Base*
类型的指针basePtr
转换为Derived*
类型的指针derivedPtr
。如果转换成功,derivedPtr
将指向Derived
对象,否则返回nullptr
。 - typeid:使用
typeid
获取basePtr
和derivedPtr
所指向对象的实际类型,并输出类型名称。
通过这段代码,可以清楚地看到 dynamic_cast
和 typeid
在多态类型中的应用。