dynamic_cast用于继承体系中安全的向下转型,依赖RTTI检查类型;转换指针失败返回nullptr,转换引用失败抛出bad_cast异常;仅适用于多态类型,且需包含虚函数,性能低于static_cast。

在C++中,dynamic_cast 是一种运行时类型转换操作符,主要用于在继承层次结构中进行安全的向下转型(downcasting),即把基类指针或引用转换为派生类的指针或引用。它依赖于RTTI(Run-Time Type Information,运行时类型信息)来检查转换是否合法。
1. dynamic_cast的基本语法
转换指针:
dynamic_cast(源指针)转换引用:
dynamic_cast>(源引用)注意:只有多态类型(即包含至少一个虚函数的类)才能使用 dynamic_cast 进行指针到引用的转换,否则编译会报错。
立即学习“C++免费学习笔记(深入)”;
2. 指针转换中的用法
当使用 dynamic_cast 转换指针时,如果转换不合法或对象不是目标类型的实例,返回 nullptr。
示例:
动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包
using namespace std;
class Base {
public:
virtual ~Base() {} // 必须是多态类型
};
class Derived : public Base {
public:
void specific() {
cout
}
};
int main() {
Base b = new Derived();
Derived d = dynamic_cast
if (d) {
d->specific(); // 安全调用派生类方法
} else {
cout
}
delete b;
return 0;
}
这里 Base 类有虚析构函数,因此是多态类型,dynamic_cast 可以正常工作。由于 b 实际指向的是 Derived 对象,转换成功。
3. 引用转换中的用法
引用不能为 null,所以当 dynamic_cast 用于引用且转换失败时,会抛出 std::bad_cast 异常。
示例:
#include#include
int main() {
Base base;
try {
Derived& dr = dynamic_cast
dr.specific();
} catch (const bad_cast& e) {
cout
}
return 0;
}
因为 base 实际是 Base 类型而非 Derived,转换失败并抛出异常。必须用 try-catch 捕获。
4. 使用注意事项
- 目标类和源类必须是多态类型(含有虚函数),否则无法使用 dynamic_cast。
- 仅适用于指针或引用的类层次转换,不能用于基本数据类型。
- 性能开销:dynamic_cast 在运行时进行类型检查,比 static_cast 慢。
- 避免频繁使用:过度依赖 dynamic_cast 可能说明设计问题,应优先考虑虚函数和多态行为。
基本上就这些。dynamic_cast 提供了类型安全的转换机制,特别适合需要判断对象真实类型再处理的场景。










