dynamic_cast

dynamic_cast介绍 首先说到c++常用的四中转换类型,我们都很清楚,分别是下面四中   1 const_cast  const_cast<目标类型>(标识符):目标类型只能是指针或者引用2 static_cast 类似C风格的强制转换,进行无条件转换,静态类型转换: 1)基类和子类之间的转换:其中子类指针转换为父类指针是安全的,但父类指针转换为子类指针是不安全的(基类和子类之间的动态类型转换建议用dynamic_cast)。 2)基本数据类型转换,enum,struct,int,cha... 阅读详情

//转载 http://blog.youkuaiyun.com/boluo1982107/article/details/3239793 的一个例子  修改运行了下


#include <iostream>
using namespace std;

class base1
{
public:
     void same_name_fun()               ----------------------1,//virtual void same_name_fun() 
    {
        cout<<"in base1 same_name_fun"<<endl;
    }
    virtual ~base1(){}
};
class base2
{
public:
    void ba2_fun()
    {
        cout<<"base2_fun"<<endl;
    }
};
class derived : public base1,base2
{
public:

    void same_name_fun()         ------------------------2,//virtual void same_name_fun()       

    {
        cout<<"in derived same_name_fun"<<endl;
    }
    void de_fun()
    {
        cout<<"de_fun"<<endl;
    }
};
int main()
{
  derived  * obj;     // note: **1没有 new
        obj->same_name_fun();         //      ** 均加上virtual 关键字  ** Segmentation fault  去掉virtual 关键字 ok

       (dynamic_cast<base1 *>(obj))->same_name_fun();

        return 0;

}

结果:

in derived same_name_fun
in base1 same_name_fun

1,2, 均加上virtual 关键字  **2 Segmentation fault  去掉virtual 关键字 ok   .


#include <iostream>
using namespace std;

class base1
{
public:
    void same_name_fun()
    {
        cout<<"in base1 same_name_fun"<<endl;
    }
    virtual ~base1(){}
};
class base2
{
public:
    void ba2_fun()
    {
        cout<<"base2_fun"<<endl;
    }
};
class derived : public base1,base2
{
public:
    void same_name_fun()
    {
        cout<<"in derived same_name_fun"<<endl;
    }
    void de_fun()
    {
        cout<<"de_fun"<<endl;
    }
};
int main()
{
    derived obj;
    obj.same_name_fun();
    (static_cast<base1>(obj)).same_name_fun();   **  //(dynamic_cast<base1>(obj)).same_name_fun(); error: cannot dynamic_cast ‘obj’ (of type ‘class derived’) to type ‘class base1’ (target is not pointer or reference)
    return 0;
}

运行结果:

in derived same_name_fun
in base1 same_name_fun

** 如果换成dynamic_cast会有error



正常的程序
#include <iostream>
using namespace std;

class base1
{
public:
    void same_name_fun()                                   //---------------------------1 加上virtual关键字  virtual  void same_name_fun()
    {
        cout<<"in base1 same_name_fun"<<endl;
    }
    virtual ~base1(){}
};
class base2
{
public:
    void ba2_fun()
    {
        cout<<"base2_fun"<<endl;
    }
};
class derived : public base1,base2
{
public:
     void same_name_fun()                         // ---------------------------2 加virtual关键字  virtual  void same_name_fun()
    {
        cout<<"in derived same_name_fun"<<endl;
    }
    void de_fun()
    {
        cout<<"de_fun"<<endl;
    }
};
int main()
{
  derived  * obj = new derived();  //note **1 有new关键字
        obj->same_name_fun();
        (dynamic_cast<base1 *>(obj))->same_name_fun();
        return 0;
}

运行结果

in derived same_name_fun
in base1 same_name_fun

1 2都加virtual关键字运行结果

in derived same_name_fun
in derived same_name_fun

dynamic_cast用法总结 dynamic_cast是C++ RTTI技术之一,那么它的应用场景是什么呢?我觉得学习一个东西得先明白它的应用场景,有了应用场景才明白为什么需要它。 dynamic_cast应用场景 C++是具有多态性的语言,有时候我们会面临这样的情况:手头只有一个基类类型的指针,但我们却希望用它来获取一些派生类中的相关信息,比如调用派生类的成员函数或者访问派生类的成员变量等,那么此时我们就需要用到dynamic_cast。它能够进行指针(或引用)安全的类型向下转换(downcasting,即从基类类型的指针转换为派生类 阅读详情

相关推荐

dynamic_cast和dynamic_pointer_cast

定义 向上转换:基类向派生类转换 向下转换:派生类向基类转换 注意:在对类对象转换时要考虑权限问题,即只有公有继承才能向下转换 static_cast 用于能够双隐或单隐的转换 例: #include <iostream> #include <vector> #include <string> using namespace std; class Base {...

iamluping的博客 923

C++--四种强制类型转换

#include using namespace std; //------static_cast-------- // int main() // { // int a = 1; // float b = 3.14; // int *p_a = &a; // float *p_b = &b; // float c = static_cas...

huhuolianmeng的博客 347

dynamic_cast的几种情况

一览本文目的基类有虚函数基类无虚函数尾语 本文目的     最近秋招看到一个有意思的问题,对一个没有虚函数的对象使用dynamic_cast会发生什么情况。想一想平时基本没用过dynamic_cast,于是干脆写点代码验证一下各种情况。首先验证对有虚函数的基类的指针和引用(2种情况),指向基类本身和其派生类(2种情况),一共四种情况的结果。然后验证基类没有虚函数时的这四种情况。 基类...

Lupin 1961

qt易错点总结

1.当单元格为空时(而非是被赋值为“”),其item调用text()会报错,因为此时的item()为空指针。 2.ui->tableWidget->setCurrentItem(ui->tableWidget->item(1,1))表示将(1,1)位置处的单元格作为当前所选的,能够成功的前提是item(1,1)不是null. 3.Qt正则表达式防止转义,需要在原来基础上再加一个\.比如"\d"在正则表达式中是真实存在的,在C++字符串中就需要加上"\",保证系统处理后仍保留"\d"

Stephen___Qin的博客 1281

dynamic_cast使用方式

                c++提供了四种新的cast机制,分别为static_cast, const_cast, dynamic_cast和reinterpret_cast。虽然也支持c中使用一对圆括号来cast,但是由于c++与c最大的区别是c++增加了类的概念,因此在子类与父类之间进行cast的时候,使用c的cast方式是无法保证其正确性的,因此c++提供了新的cast机制(虽然比

BlueSoal的专栏 6600

dynamic_cast和polymorphic_cast的比较

C++中的多态转换是通过函数dynamic_cast来实现的。适用于dynamic_cast函数的典型场合有两种:从基类向派生类的向下转型和交叉转型(crosscast),即从一个基类到另一个基类的转型。为了理解这两个概念的含义,参考下面的代码,可以将polymorphic_cast换成dynamic_cast。类型继承关系,在base1和base2中,分别有一个虚析构函数(delete p的时候

boluo1982107的专栏 2902

dynamic_cast详解

作为四个内部类型转换操作符之一的dynamic_cast和传统的C风格的强制类型转换有着巨大的差别。除了dynamic_cast以外的转换,其行为的都是在编译期就得以确定的,转换是否成功,并不依赖被转换的对象。而dynamic_cast则不然。在这里,不再讨论其他三种转换和C风格的转换。首先,dynamic_cast依赖于RTTI信息,其次,在转换时,dynamic_cast会检查转换的sourc

不亦快斋 5万+

C++(03):dynamic_cast

dynamic_cast主要用于有继承关系的多态类(基类必须有虚函数)的指针或引用之间的转换。1.通过dynamic_cast,将派生类指针转换为基类指针(上行转换),这个操作与static_cast的效果是一样的。2.通过dynamic_cast,将基类指针转换为派生类指针(下行转换),dynamic_cast具有类型检查的功能,比static_cast更安全(如果转换的是指针,失败时会返回空指针;如果转换的是引用,会抛出std::bad_cast异常)...

风静如云的博客 5205

static_cast和dynamic_cast详解

类继承关系图注:从图中可以看出,派生类不仅有自己的方法和属性,同时它还包括从父类继承来的方法和属性。当我们从派生类向基类转换时,不管用传统的c语言还是c++转换方式都可以百分百转换成功。但是可怕是向下转换类型,也就是我们从基类向派生类转换,当我们采用传统的C语言和c++转换时,就会出现意想不到的情况,因为转换后派生类自己的方法和属性丢失了,一旦我们去调用派生类的方法和属性那就糟糕了,这就是对类继承关

的博客 13万+

学习笔记9--智能驾驶的功能安全设计之功能安全设计

本系列博客包括6个专栏,分别为:《自动驾驶技术概览》、《自动驾驶汽车平台技术基础》、《自动驾驶汽车定位技术》、《自动驾驶汽车环境感知》、《自动驾驶汽车决策与控制》、《自动驾驶系统设计及应用》。此专栏是关于《自动驾驶系统设计及应用》书籍的笔记.

FUXI_Willard 1794

秦时明月6.2魔改版_从零到一部署指南_含安卓客户端配置与GM后台直通

本文详细介绍了秦时明月6.2魔改版的从零到一部署指南,包括环境准备、服务端安装、安卓客户端配置以及GM后台直通等关键步骤。特别针对安卓客户端配置和GM工具使用提供了实用技巧,帮助用户快速搭建并优化游戏服务器,确保稳定运行。

weixin_42522964的博客 315

C++中的dynamic_cast和dynamic_pointer_cast

dynamic_cast: 将一个基类对象指针(或引用)cast到继承类指针,dynamic_cast会根据基类指针是否真正指向继承类指针来做相应处理。 主要用途:将基类的指针或引用安全地转换成派生类的指针或引用,并用派生类的指针或引用调用非虚函数。如果是基类指针或引用调用的是虚函数无需转换就能在运行时调用派生类的虚函数。 转换方式: dynamic_cast< type* &gt...

贾作真时真亦贾的博客 1万+

手把手教你使用HFSS仿真高速差分过孔—上

高速数字电路设计中,信号完整性是一个非常重要的问题。为了使信号保持良好的传输特性,PCB板上的互联线一般都采用均匀传输线,使互联线保持特性阻抗一致性,减少信号反射。然而PCB板上的互联线很多时候避免不了换层的问题,这时候就必须使用过孔。过孔会导致阻抗不连续,进而造成反射,出现信号完整性问题。         当信号传输速率越高,信号前沿越短的时候,过孔引入的信号完整性问题越严重,需要对过孔进行优

a2447944219的博客 2万+

dynamic_cast彻底明白了~

dynamic_cast < type-id > ( expression) 该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、类的引用或者void*; 如果type-id是类指针类型,那么expression也必须是一个指针,如果type-id是一个引用,那么expression也必须...

BangBang的博客 6523

华为海思2026届数字IC秋招笔试真题解析与实战技巧(2025最新版)

本文深度解析华为海思2026届数字IC秋招笔试真题,涵盖高频考点如后端设计、低功耗设计、SystemVerilog语法等核心内容。提供时序违例修复、时钟树综合等实战技巧,帮助考生高效备考。特别关注UPF低功耗设计规范等最新考点,助力考生在秋招笔试中脱颖而出。

lg888的博客 1088

ADI DSP开发环境(CCES)下的程序烧录问题(以ADSP-SC589为例)

在CCES环境下将程序烧录到flash主要有两种方式。首先在对项目编译产生文件的属性设置为Release。 在编译完成后,找到每个CORE单独生成的DXE文件: 文件通常位于项目目录下每个core的Release文件中。安装SC589评估板的驱动(ADSP-SC5xx_EZ-KIT_Lite-Rel2.0.0.exe)后,在安装目录下可以找到SPI FLASH芯片的驱动程序(sc589_w25q128fv_dpia_Core1.dxe): 把文件copy到CCES 的目录下由于SC58x处理器的特殊性

daijingxin的博客 3730

【C++】dynamic_cast用法总结

dynamic_cast < type-id > ( expression) 该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、类的引用或者void*; 如果type-id是类指针类型,那么expression也必须是一个指针,如果type-id是一个引用,那么expression也必须是一个引用。 ...

weixin_44212574的博客 4万+

基于openwrt平台搭建局域网技术验证之四

1、测试目的 验证l2tp客户端模式的可行性。 提供vpn-l2tp模式的客户端功能。 2、参考资料 参考链接1:https://www.lucktang.com/191.html 3、测试过程 测试过程需要用到的资源: 路由器俩个 win7系统电脑俩台 ③ 交换机一个 ④ 网线三根 测试组网如下图所示: 组网说明: R0公司路由器 S1 交换机 R1 路由器1 R2 路由器2 PC1 个人电脑1 PC2 个人电脑2 (R0) lan口接(S1)...

caofengtao1314的专栏 1960

static_cast和dynamic_cast的区别,看完这篇你就懂了!

看了很久了这两个到底是怎么回事,终于今天幡然悔悟。还是要多读书呀。 在C++ primer plus的15章第5节里有介绍: 1 dynamic_cast : 书上主要有两个地方说明白了用途: dynamic_cast运算符的用途是,使得能够在类层次中进行向上转换 仅当Low是High的可访问基类时,下面的语句才会将一个Low*指针赋给pl: pl = dynamic_cast<Low*>ph ; //说明下其中ph是派生类指针,pl是基类指针 否则,该语句将空指针....

Behold1942的博客 1万+

python基础:工作会用到的95%的基础python代码都在这了(万字详解!)

本文是一份Python编程语言的快速参考备忘单,涵盖了Python基础语法和常用数据类型。主要内容包括:Python入门指南(打印、变量声明)、内置数据类型(字符串、数值、列表、元组、集合、字典等)、控制结构(判断、循环)、函数定义、文件处理操作以及字符串操作方法(切片、循环遍历等)。这个备忘单特别适合初学者快速查阅Python基础语法,同时也提供了数据类型转换、f-string格式化字符串等实用技巧。通过简洁的代码示例展示了Python的基本语法规则和典型用法。

数据知道的博客 8160

SAP_PP模块定额工艺路线简介

在 SAP PP(生产计划)模块中,定额工艺路线(Routing) 是生产制造流程中的核心主数据之一,用于定义制造一个产品所需的标准操作步骤。工艺路线详细描述了生产过程中的各个工序、使用的工作中心、标准作业时间、资源分配等信息,是进行生产计划、成本核算、排产控制、车间执行等功能的基础。

我小时候很黑的博客 763

static_cast和dynamic_cast

static_cast和dynamic_cast前言一、static_cast关键字(编译时类型检查)二、dynamic_cast关键字(运行时类型检查)总结 前言 在C++标准中,提供了关于类型层次转换中的两个关键字static_cast和dynamic_cast。 一、static_cast关键字(编译时类型检查) 用法:static_cast < type-id > ( expression ),该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的.

lutongjia 5844

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

static_cast和dynamic_cast的区别

static_cast //用法: static_cast < type-id > ( exdivssion ) 该运算符把exdivssion转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法: ①用于类层次结构中基类和子类之间指针或引用的转换。   进行上行转换(把子类的指针或引用转换成基类表示)是安全的;   进行下行转换(把基类指针或引用转换成子类表示)时,由于没有动态类型检查,所以是不安全的。 ②用于基本数据类型之间的转换,如把int转换成cha

qq_45786156的博客 529

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【C++类型转换】static_cast、dynamic_cast、const_cast、reinterpret_cast

中,并在后续标准(C++11/14/17/20)中保持稳定。这四大类型是 C++ 对 C 风格强制转换的现代化、安全化替代方案。在 C 语言中,类型转换通常使用。enum 与整型之间。

普罗米修斯的博客 693

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

C++ dynamic_cast实现原理

dynamic_cast是一个操作符,查看

passion_wu128的专栏 2万+
上一篇: 友元类
windowsLearner
博客等级 码龄17年 6粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值