首页 > 其他分享 >static_cast与dynamic_cast到底是什么?

static_cast与dynamic_cast到底是什么?

时间:2024-04-23 20:44:37浏览次数:16  
标签:子类 dynamic cast static 父类 指针

写这个随笔说一下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:子类转父类:可以转,不报错,安全。

 

总体来看,子类指针父类指针无论怎样都是安全、允许的(上面的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
}

输出:成功了。

 

标签:子类,dynamic,cast,static,父类,指针
From: https://www.cnblogs.com/pkuqcy/p/18153681

相关文章

  • Dynamics 365(三)WEB资源使用
    在Dynamics365可以通过WEB资源来对按钮/表单进行自定义控制一、添加图片/网页/脚本通过解决方案->Web资源->新增进行 二、网页的使用选择需要的实体窗体,插入Web资源三、按钮配置通过此页面>自定义->导入解决方案 可以看到有Home,Form和SubGri不同的按钮显示,......
  • Java中的static关键字解析
    一.static关键字的用途二.static关键字的误区三.常见的笔试面试题一.static关键字的用途在《Java编程思想》P86页有这样一段话:“static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,......
  • 拥抱 invokedynamic,在 Java agent 中驯服类加载器
    前言在开发项目的agent时,找了很多类隔离加载的解决方案,最终参照开源项目实现,采用了ElasticAPMJavaagent的方案。以下为本方案的核心说明文章。翻译正文ByteBuddy最棒的一点是,它允许您编写Javaagent,而无需手动处理字节代码。agent作者只需用纯Java编写要注入的代码,......
  • Dynamics CRM 2013 批处理
    GetServiceusingSystem;usingSystem.Configuration;usingMicrosoft.Xrm.Client;usingMicrosoft.Xrm.Client.Services;usingMicrosoft.Xrm.Sdk;usingMicrosoft.Xrm.Sdk.Query;namespaceTest{classProgram{staticvoidMain(string[]args)......
  • 人形机器人 —— NVIDIA公司给出的操作算法(动态操作任务,dynamic manipulation tasks)(机
    原文:https://developer.nvidia.com/isaac/manipulator#foundation-modelsNVIDIA公司准备针对人形机器人的各部分操作分别推出一个AI框架,如:步态控制、3D感知、抓取操作、避障和规划,等等,本文介绍的就是NVIDIA计划推出的操作任务的算法的AI框架(manipulationtasks)。......
  • day11_我的Java学习笔记 (static_静态成员变量+静态成员方法_工具类、代码块_静态代码
    0.面向对象进阶1.static静态关键字1.1static是什么,static修饰成员变量的用法Java成员变量成员方法Python类(对象)属性类(对象)方法static修饰成员变量的应用:在线人数统计1.2static修饰成员变量的内存原理1.3static修饰成员方法的基本......
  • C++,四种强制类型转换,static_cast,const_cast,dynamic_cast,reinterpret_cast
      #include<iostream>usingnamespacestd;structA{virtualvoidfunc(){cout<<"Afunc"<<endl;}};structB:publicA{voidfunc(){cout<<"Bfunc"<<endl;}};intmain(){c......
  • 【Python】Django中的static资源访问404的问题
    [本文出自天外归云的博客园]如果你发现你本地部署没问题,部署到生产环境服务器后提示404找不到静态资源文件。不是你的代码有问题,而是你没有使用--insecure参数启动服务。pythonmanage.pyrunserver0.0.0.0:8000--insecure但是这个insecure参数在Django4中已经去掉了,所以......
  • VB中DirectCast和CType的区别及使用
    DirectCast:主要用于执行明确的类型转换,只能在编译时确定类型关系时使用。如果转换不是有效的,则会引发异常。如果你要把一个Object变量用DirectCast转换成String,必须确定这个变量确实包含一个String(或者为Nothing).如果它包含一个Integer之类的东西,会抛出一个异常......
  • uRPF(Unicast Reverse Path Forwarding,单播反向路径转发)
    uRPF(UnicastReversePathForwarding)概念和原理这是网络设备的一个安全特性,主要功能是用于防止基于源地址欺骗的网络攻击行为,说简单一点就是在IP数据包转发的时候不单基于目的地址查看路由表,对源地址同样进行查表,如未能查到路由(一般不是默认路由,但根据策略不同行为稍有区别),则......