一、简介
dynamic_cast 是 C++中的一种类型转换操作符,主要用于处理类层次结构中的向上和向下转换。其主要用途包括:
对象向上转型:将基类指针或引用安全地转换为派生类指针或引用。
对象向下转型:将派生类指针或引用转换为基类指针或引用。
二、代码
#include <iostream>
class Base {
public:
virtual void f() {}
};
class Derived : public Base {
public:
void f() { std::cout << "I am Derived" << std::endl; }
};
int main() {
// 1. 向下转型(Down-casting)(父类转子类)
// 尝试将基类指针转换为派生类指针,这是不安全的,因为基类指针可能指向派生类的对象,也可能指向不相关的其他类型的对象。
//如果转换不安全,dynamic_cast 会返回 nullptr。
Base* base_up = new Base;
Derived* derived_up =
dynamic_cast<Derived*>(base_up); // 无效的转换,结果为 nullptr
if (derived_up) {
std::cout << "Base to Derived succeed (base_up)" << std::endl;
derived_up->f();
} else {
std::cout << "Base to Derived fail for null (base_up)" << std::endl;
}
Base* base_up2 = new Derived;
Derived* derived_up2 =
dynamic_cast<Derived*>(base_up2);
if (derived_up2) {
std::cout << "Base to Derived succeed (base_up2) " << std::endl;
derived_up2->f();
} else {
std::cout << "Base to Derived fail for null (base_up2)" << std::endl;
}
// derived_up转换失败是一个nullptr。(因为derived_up 实际上不指向 Derived 类的对象),
// derived_up2转换成功,将是一个有效的指针
// 2. 向上转型(Up-casting)
// 将派生类指针转换为基类指针是安全的,因为所有的派生类对象都是基类对象。在这种情况下,dynamic_cast 会成功地执行转换
Derived* derived_down = new Derived;
Base* base_down =
dynamic_cast<Base*>(derived_down); // 有效的转换,结果不为 nullptr
if (base_down) {
std::cout << "Derived to Base succeed " << std::endl;
base_down->f();
} else {
std::cout << "Derived to Base fail for null" << std::endl;
}
// 注意点:
// dynamic_cast 只能用于含有虚函数的类。这是因为 dynamic_cast
// 需要运行时类型信息(RTTI)来确定对象的实际类型。 在进行 dynamic_cast
// 时,如果转换不安全,dynamic_cast 会返回 nullptr,而不是抛出异常。这是因为
// C++ 的异常处理机制不适用于指针类型。
// 对于引用类型的转换,如果转换不安全,会直接产生运行时错误,程序会终止。
return 0;
}
三、运行结果

本文详细介绍了C++中的dynamic_cast操作符,包括其在对象向上转型(基类到派生类)和向下转型(派生类到基类)中的使用,以及它如何处理虚函数和运行时类型信息。
4095

被折叠的 条评论
为什么被折叠?



