static_cast与dynamic_cast到底是什么?

这篇具有很好参考价值的文章主要介绍了static_cast与dynamic_cast到底是什么?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

写这个随笔说一下C++的static_cast和dynamic_cast用在子类与父类的指针转换时的一些事宜。首先,【static_cast,dynamic_cast】【父类指针,子类指针】,两两一组,共有4种组合:用 static_cast 父类转子类、用 static_cast 子类转父类、使用 dynamic_cast 父类转子类、用 dynamic_cast 子类转父类。搞清楚了这4种情况,这篇文章的任务也就达成了。

先说结论,后面给出一个作者觉得通俗易懂的理解:

1. static_cast : 父类转子类:可以转,不报错,不安全;

2.static_casrt : 子类转父类:可以转,不报错,安全;

3.dynamic_cast : 父类转子类 :

  a)若父类中没有虚函数,不能转,编译报错;

  b)若父类至少有一个虚函数则可以转,不报错;但:

    b.1)若父类指针指向的确实是一个子类对象,则dynamic_cast返回该子类对象的地址;

    b.2)若父类指针指向的是父类对象,则dynamic_cast返回空指针nullptr;

 4.dynamic_cast:子类转父类:可以转,不报错,安全。

 文章来源地址https://www.toymoban.com/news/detail-856743.html

总体来看,子类指针父类指针无论怎样都是安全、允许的(上面的2、4),所以static_cast和dynamic_cast都可以安全使用。

再说上面的1、3。 其实,static_cast相当于我们程序员对编译器的一种承诺:我们清楚地知道这样转存在的任何风险,并且我们能够接受这样的风险。所以,当我们用static_cast将父类指针转换成子类指针时,编译器不报错。而dynamic_cast是在运行时执行类型转换,用于将基类的指针安全地转换成派生类的指针,也就是说,dynamic_cast会进行动态类型检查。dynamic_cast相当于给程序员提供了一种安全的机制,让程序员能够安全地使用父类指针的动态类型。

下面举一个使用dynamic_cast(以上3中的b)的例子。首先给出父类和子类的定义:

class B
{
public:
    virtual ~B() {};
};

class D : public B
{

};

若有以上类的定义:

代码1:

B* pb = new B;
if( D* p3 = dynamic_cast<D*>(pb) )   
{
    cout << "成功了" << endl;
  //若程序到此处,则程序员知道,pb指向的实际上是子类对象,可以使用p3
}
else {
    cout << "失败了" << endl;
  //若程序到此处,则程序员知道,pb指向的实际上是父类对象,使用pb
}

 

输出:失败了。因为动态运行时,pb指向的是父类,并不是子类。

代码2:

B* pb = new D;
if( D* p3 = dynamic_cast<D*>(pb) )   
{
    cout << "成功了" << endl;
  //若程序到此处,则程序员知道,pb指向的实际上是子类对象,可以使用p3
}
else {
    cout << "失败了" << endl;
  //若程序到此处,则程序员知道,pb指向的实际上是父类对象,使用pb
}

输出:成功了。

 

到了这里,关于static_cast与dynamic_cast到底是什么?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • srand(static_cast<unsigned>(time(NULL)))

    srand(static_castunsigned(time(NULL))) 在 C++ 中是用来初始化随机数生成器的代码。 这段代码中, time(NULL) 返回系统当前时间距离 Epoch(Unix 时间的起始时间,通常是1970年1月1日 00:00:00 UTC)的秒数,用 NULL 表示不考虑时区的情况下获取当前时间。然后,将这个时间值传递给 srand 函数,

    2024年02月07日
    浏览(42)
  • C++面试八股文:static_cast了解一下?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第20面: 面试官:C++中支持哪些类型转换? 二师兄:C++支持C风格的类型转换,并在C++11引入新的规范了类型转换。 二师兄:C++11引入四种新的类型转换,分别是 static_cast 、 dynamic_cast 、 const_cast 、和 reinterpret_cast 。 二师

    2024年02月09日
    浏览(35)
  • C++的类型转换运算符:dynamic_cast

    顾名思义,与静态类型转换相反,动态类型转换在运行阶段(即应用程序运行时)执行类型转换。 可检查 dynamic_cast 操作的结果,以判断类型转换是否成功。使用 dynamic_cast 运算符的典型语法如下: 例如: 如上述代码所示,给定一个指向基类对象的指针,程序员可使用 dyna

    2024年02月15日
    浏览(45)
  • 【C++】dynamic_cast 进行类型转换步骤以及底层实现

    dynamic_cast 是 C++ 中的一种类型转换方式,它可以在运行时进行类型检查, 用于将一个指针或引用强制转换为另一个类型的指针或引用 。dynamic_cast 能够进行安全的向下转型,即将一个基类指针或引用转换为派生类指针或引用。如果转换成功,dynamic_cast 返回转换后的指针或引用

    2023年04月25日
    浏览(48)
  • c++ 之 dynamic_pointer_cast

    /*  * dynamic_pointer_cast  */     描述 (Description)         它返回一个正确类型的sp副本,其存储的指针从U *动态地转换为T *。     声明 (Declaration)         以下是std :: dynamic_pointer_cast的声明。         template class T, class U           shared_ptrT dynamic_pointer_cast (const shared_

    2024年02月15日
    浏览(39)
  • SparkException: Dynamic partition strict mode requires at least one static partition column

    创建表后却无法写入数据? 报错内容:== Exception in thread “main” org.apache.spark.SparkException: Dynamic partition strict mode requires at least one static partition column. To turn this off set hive.exec.dynamic.partition.mode=nonstrict at org.apache.spark.sql.hive.execution.InsertIntoHiveTable.processInsert(InsertIntoHiveTable.scala:1

    2024年04月11日
    浏览(57)
  • 【论文阅读】Fast subgraph query processing and subgraph matching via static and dynamic equivalences

    子图查询处理(也称为子图搜索)和子图匹配是许多应用领域中的基本图问题。为解决这些问题制定实际的解决办法,人们已经作出了许多努力。尽管付出了这些努力,但现有的算法在处理大型图和/或许多图时显示出了有限的运行时间和可伸缩性。在本文中,我们提出了一个

    2024年02月03日
    浏览(42)
  • windows11 这个男神到底值得用吗?——一个男神的传奇

    hihihi,我总算开始更新了!这一天(11/21),正好我在家里上课,所以我来了兴致,给大家讲讲windows11,这个男神的传奇! Windows 11是由微软公司(Microsoft)开发的操作系统,应用于计算机和平板电脑等设备。于2021年6月24日发布,2021年10月5日发行。 Windows 11提供了许多创新功

    2024年02月09日
    浏览(43)
  • C/C++ static关键字详解(最全解析,static是什么,static如何使用,static的常考面试题)

    目录 一、前言  二、static是什么? 三、static修饰的对象是什么?   四、C 语言中的 static  🍎static的C用法  🍉static的重点概念  🍐static修饰局部变量  💦static在修饰局部变量和函数的作用  🍓static修饰全局变量和函数 💦static在修饰全局变量和函数的作用

    2024年02月05日
    浏览(47)
  • 到底什么是哈希值,哈希值到底是怎么生成的,有什么用?

    哈希值,即HASH值,通常用一个短的随机字母和数位组成的字串来代表,是一组任意长度的输入信息通过哈希算法得到的“数据指纹”,即进行加密运算得到的一组二进制值。 因为电脑在底层机器码是采用二进位的模式,因此通过哈希算法得到的任意长度的二进位值映像为较

    2024年02月19日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包