推荐答案
// www.javascriptcn.com code example
#include <iostream>
#include <typeinfo>
class Base {
public:
virtual ~Base() {}
};
class Derived : public Base {};
int main() {
Base* basePtr = new Derived;
// 使用 dynamic_cast 进行向下转型
Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);
if (derivedPtr) {
std::cout << "Downcasting successful!" << std::endl;
} else {
std::cout << "Downcasting failed!" << std::endl;
}
// 使用 typeid 获取类型信息
std::cout << "Type of basePtr: " << typeid(*basePtr).name() << std::endl;
std::cout << "Type of derivedPtr: " << typeid(*derivedPtr).name() << std::endl;
delete basePtr;
return 0;
}本题详细解读
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 在多态类型中的应用。