C++学习笔记(14) static_cast 与 dynamic_cast
dynamic_cast运算符能够在运行时将一个对象强制转换成其实际类型:
实际应用场景:在C++学习笔记(13)中,在main.cpp里面定义了displayGeometric()函数,
void displayGeometric(const Geometric& g) { cout << g.toString() << endl; }
假设现在需要对这个函数进行修改:
函数参数类型不变,当参数时rectangle类型的对象时,输出width和height, 当参数是circle类型的对象时,输出半径 。
首先介绍一种错误的实现方法:
void displayGeometric(const Geometric& g) { cout << "The radius is " << g.getRadius() << endl; cout << "The width is " << g.getWidth() << endl; cout << "The height is " << g.getHeight() << endl; }
很明显,这种方法是无法通过编译的!
在前面的学习中,知道static_cast能够对变量进行强制类型转换(静态转换)。能否通过static_cast实现呢?
void displayGeometric(const Geometric& g) { Geometric* p = &g; cout << "The radius is " << static_cast<Circle*>(p)->getRadius() << endl; cout << "The width is " << static_cast<Rectangle*>(p)->getWidth() << endl; cout << "The height is " << static_cast<Rectangle*>(p)->getHeight() << endl; }
这样会存在函数 displayGeometric() 可能会将circle错误的转化为rectangle而调用getWidth()方法。所以任然是错误的,因为static_cast()不能对转换成功的结果进行检查,而我们的要求是,在调用getRadius()之前必须确保对象是一个circle.
dynamic_cast与static_cast的功能类似,但是,dynamic_cast在运行时进行检查从而保证转换的成功进行。转换失败会返回NULL. 所以用dynamic_cast可以实现上面要求的功能
void displayGeometric(const Geometric& g) { Geometric* p = &g; Circle* p1 = dynamic_cast<Circle*>(p); Rectangle* p2 = dynamic_cast<Rectangle*>(p); if(p1 != NULL) // Circle类性转换成功 { cout << "The radius is " << p1->getRadius() << endl; } if(p2 != NULL) // Rectangle转换成功 { cout << "The width is " << p2->getWidth() << endl; cout << "The height is " << p2->getHeight() << endl; } }
注:
dynamic_cast只能在多态类型的指针或者引用上使用,也就是说该类型必须包含虚函数,dynamic_cast可以在运行时检查强制转换是否成功。static_cast则在编译的时候起作用。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)