首页
学习
活动
专区
圈层
工具
发布

C++强制类型转换操作符 dynamic_cast

一种是基类指针所指对象是派生类类型的,这种转换是安全的;另一种是基类指针所指对象为基类类型,在这种情况下dynamic_cast在运行时做检查,转换失败,返回结果为0; #include "stdafx.h...cout<<"第二种情况转换成功"<<endl; der1->Show(); } else { cout失败...在前面的例子中,使用了dynamic_cast将基类指针转换为派生类指针,也可以使用dynamic_cast将基类引用转换为派生类引用。...与指针一样,引用的向下转型也可以分为两种情况,与指针不同的是,并不存在空引用,所以引用的dynamic_cast检测失败时会抛出一个bad_cast异常: int main() { //...(base); } catch(bad_cast) { cout失败,抛出bad_cast异常"<<endl; }

92540
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C++强制类型转换操作符 dynamic_cast

    ⚡ C++ dynamic_cast 详解1️⃣ 基本概念定义:dynamic_cast 是 C++ 提供的 运行时类型安全的强制类型转换操作符作用:将 基类指针/引用 安全地转换为 派生类指针/引用特点...3️⃣ 使用场景多态类型安全下的向下转型(Downcasting)将基类指针转换为派生类指针在运行时保证类型安全类型检查在访问派生类特有成员前,先检查对象类型避免非法转换相比 static_cast,dynamic_cast...: " << e.what() << endl;}5️⃣ 注意事项注意点说明必须有虚函数dynamic_cast 仅对多态类型有效指针转换失败返回 nullptr适用于指针类型向下转型引用转换失败抛出异常适用于引用类型向下转型不适用于非多态类编译器无法进行运行时类型检查性能开销需要...RTTI 支持,运行时有一定开销6️⃣ 总结dynamic_cast 用于 多态类安全下的类型转换常用于 向下转型(Base → Derived)指针失败返回 nullptr,引用失败抛出 std::...bad_cast需要虚函数表支持(即基类有虚函数) 小技巧:在调用派生类特有函数前,最好 先 dynamic_cast 检查类型尽量避免频繁向下转型,设计时可用 虚函数 或 访问接口 替代https:/

    35210

    C++核心准则C.148:使用dynamic_cast进行指针类型转换时,将不能发现目标类看作是有效的选项

    alternative C.148:使用dynamic_cast进行指针类型转换时,将不能发现目标类看作是有效的选项 Reason(原因) The dynamic_cast conversion allows...由于转换失败的结果仅仅是返回一个空值,这个结果可以在执行时检查。这个特性允许根据结果选择不同的路径。...和C.147不同,那里的失败是错误,而且不应该被用于条件执行。...寻找所需类的失败会导致dynamic_cast返回一个空值,而解引用一个空指针会引起无定义的行为。因此应该总是认为dynamic_cast的结果可能为空并进行检查。...(复杂) 如果在dynamic_cast执行之后,没有对结果指针进行空判断,那么对使用这个指针的代码报警。

    1.3K10

    static_cast, dynamic_cast, reinterpret_cast, const_cast区别

    我们看到一个奇怪的现象,将父类经过dynamic_cast转成子类的指针竟然是空指针!...这正是dynamic_cast提升安全性的功能,dynamic_cast可以识别出不安全的下行转换,但并不抛出异常,而是将转换的结果设置成null(空指针)。...,且在下行转换时要求基类是多态的,如果发现下行转换不安全,dynamic_cast返回一个null指针,dynamic_cast总是认为void*之间的转换是安全的;reinterpret_cast可以对无关类指针进行转换...而function(dynamic_cast(ref_b))编译时也能过,但在运行时就失败了,因为dynamic_cast在运行时检查了ref_b的实际类型,这样怎么也骗不过去了。   ...// pY2->bar();正如我们在泛型例子中所认识到的,如果你尝试转换一个对象到另一个无关的类static_cast将失败,而reinterpret_cast就总是成功“欺骗”编译器:那个对象就是那个无关类

    1.1K20

    C++中的提供的四种类型转换方式;

    2. dynamic_cast dynamic_cast主要用于在类的继承层次结构中进行安全的和向上向下转型或交叉转型(在多继承情况下)。它在运行时检查对象的类型信息。...如果是指针类型,转换失败会返回nullptr;如果是引用类型,转换失败会抛出std::bad_cast异常。...*>(basePtr); // 失败,返回nullptr(指针类型) try { Derived& derivedRef = dynamic_cast(*basePtr);...// 失败,抛出std::bad_cast异常(引用类型) } catch (const std::bad_cast& e) {} 应用场景:这种运行时类型检查机制使得在复杂的类层次结构中,可以安全地进行向下转型操作...用于多态类型的检查: 如果dynamic_cast的目标类型是指针类型,并且转换失败,它会返回nullptr;如果目标类型是引用类型,并且转换失败,它会抛出std::bad_cast异常。

    49110

    C++:16---强制类型转换和类型转换

    语句的转换目标是指针类型且失败了,则结果为0 如果一条dynamic_cast语句的转换目标是引用类型且失败了,则dynamic_cast运算符抛出一个bad_cast异常 运行时类型识别(RTTI)的功能由两个运算符实现...Base {}; int main() { Base *bp = new Base; //成功返回Derived指针,失败返回0 if (Derived *dp = dynamic_cast失败,即使后续的代码忘了做相应判断,也不会接触到这个未绑定的指针,从而程序时安全的。...引用类型的dynamic_cast 引用类型的dynamic_cast与指针类型的dynamic_cast使用起来类似,只是两者在出错时的返回值不同: 引用类型的dynamic_cast在出错时会抛出异常...指针类型的dynamic_cast在出错时返回0 当对引用的类型转换失败时,程序抛出一个名为std::bad_cast的异常,该异常定义在typeinfo头文件中 例如: class Base { public

    2.6K20

    C++中的四种类型转换运算符

    static_cast 是“静态转换”的意思,也就是在编译期间转换,转换失败的话会抛出一个编译错误。...对于指针,如果转换失败将返回 NULL;对于引用,如果转换失败将抛出std::bad_cast异常。...2) 向下转型(Downcasting)向下转型是有风险的,dynamic_cast 会借助 RTTI 信息进行检测,确定安全的才能转换成功,否则就转换失败。...pa 是A*类型的指针,当 pa 指向 A 类型的对象时,向下转型失败,pa 不能转换为B*或C*类型。当 pa 指向 D 类型的对象时,向下转型成功,pa 可以转换为B*或C*类型。...总起来说,dynamic_cast 会在程序运行过程中遍历继承链,如果途中遇到了要转换的目标类型,那么就能够转换成功,如果直到继承链的顶点(最顶层的基类)还没有遇到要转换的目标类型,那么就转换失败。

    96820

    【C++】类型转换

    隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败 显式类型转化:需要用户自己处理 例如: void Test() { int i = 1; // 隐式类型转换...4. dynamic_cast dynamic_cast 用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换),这个是C语言不具备的。...,从而帮我们实现转换,如果它之前是父类,现在转换为子类,那么就是不可以的,会转换失败,转换失败会返回空;如果它之前是子类,变成父类后又转换为子类,是可以的,就帮我们进行转换。...dynamic_cast 还需要一个前提,就是父类必须要有虚函数。...对上面的代码进行测试,当传入父类的对象,转换失败: 当传入子类的对象,转换成功: 总结: dynamic_cast 只能用于父类含有虚函数的类; dynamic_cast 会先检查是否能转换成功,能成功则转换

    72710

    快速失败机制&失败安全机制

    这篇文章时,我在8.1小节提到了快速失败和失败安全机制。 但是我发现当我搜索"快速失败"或"失败安全"的时候,检索出来的结果百分之90以上都是在说Java集合中是怎么实现快速失败或失败安全的。...在我看来,说到快速失败、失败安全时,我们首先想到的应该是这是一种机制、一种思想、一种模式,它属于系统设计范畴,其次才应该想到它的各种应用场景和具体实现。...可以看一下wiki上对于快速失败和失败安全的描述: 快速失败:http://en.wikipedia.org/wiki/Fail-fast 失败安全:http://en.wikipedia.org/wiki...本文就对比一下Java集合中的快速失败、失败安全和Dubbo框架中的快速失败、失败安全。 读完之后,你就知道Java集合中实现和Dubbo中的实现就大不一样。...Dubbo中的体现之前,我们必须先说说Dubbo中的集群容错机制,因为快速失败和失败安全是其容错机制中的一种。

    2.4K10

    【C++】类型转换 ④ ( 子类 和 父类 之间的类型转换 - 动态类型转换 dynamic_cast )

    在之前写过一篇 C++ 类型转换的博客 【C++ 语言】类型转换 ( 转换操作符 | const_cast | static_cast | dynamic_cast | reinterpret_cast...动态类型转换 dynamic_cast , 一般用于 子类 和 父类 之间的类型转换 , 运行时 , 如果类型转换成功 , 则进行转换 ; 运行时 , 如果类型转换失败 , 则返回转换结果 NULL...; 借助上述特性 , 动态类型转换 dynamic_cast 可用于在 运行时 识别对象类型 ; 将 对象 强转为 指定类型对象, 如果失败了, 转换结果为 NULL , 说明被转换的对象 不是 指定类型的对象..., 说明不是 Son 子类对象, 转换结果是 NULL , 也就是 0 Son* son = dynamic_cast(obj); if (son !...如果转换成功, 说明 obj 对象就是 Son 子类对象 // 如果转换失败, 说明不是 Son 子类对象, 转换结果是 NULL , 也就是 0 Son* son = dynamic_cast<Son

    1.6K21
    领券