首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

dynamic_cast是四个强制类型转换操作符中最特殊的一个,它支持运行时识别指针或引用。...当编译器不开启RTTI时,运行含有dynamic_cast操作符的程序时会出现一个警告: warning C4541: “dynamic_cast”用在了带 /GR- 的多态类型“ANIMAL”上;可能导致不可预知的行为...主要用于“安全地向下转型” dynamic_cast用于类继承层次间的指针或引用转换。...至于“先上转型”(即派生类指针或引用类型转换为其基类类型),本身就是安全的,尽管可以使用dynamic_cast进行转换,但这是没必要的, 普通的转换已经可以达到目的,毕竟使用dynamic_cast是需要开销的...和引用类型 在前面的例子中,使用了dynamic_cast将基类指针转换为派生类指针,也可以使用dynamic_cast将基类引用转换为派生类引用。

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

static_cast, dynamic_cast, reinterpret_cast, const_cast区别

我们看到一个奇怪的现象,将父类经过dynamic_cast转成子类的指针竟然是空指针!...这正是dynamic_cast提升安全性的功能,dynamic_cast可以识别出不安全的下行转换,但并不抛出异常,而是将转换的结果设置成null(空指针)。...可见dynamic_cast认为空指针的转换安全的,但这里类A和类B必须是多态的,包含虚函数,若不是,则会编译报错。...,且在下行转换时要求基类是多态的,如果发现下行转换不安全,dynamic_cast返回一个null指针,dynamic_cast总是认为void*之间的转换是安全的;reinterpret_cast可以对无关类指针进行转换...而function(dynamic_cast(ref_b))编译时也能过,但在运行时就失败了,因为dynamic_cast在运行时检查了ref_b的实际类型,这样怎么也骗不过去了。

77720

static_cast, dynamic_cast, const_cast 和 reinterpret_cast 怎么用

static_cast dynamic_cast const_cast reinterpret_cast C 语言风格类型转化(type)value 函数式风格类型转换type(value) 回答 static_cast...(即子类的指针或引用转换成基类表示)是安全的,不过一般在进行这样的转化时会省略 static_cast;进行下行转换(即基类指针或引用转换成子类表示)时,由于没有动态类型检查,所以是不安全的,一般用 dynamic_cast...class Base { }; class Derived : public Base { }; Base a, *ptr_a; Derived b, *ptr_b; ptr_a = dynamic_cast...(&b); // 成功 ptr_b = dynamic_cast(&a); // 失败,因为基类无虚函数 class Base { virtual void dummy...(ptr_a); // 成功 ptr_d = dynamic_cast(ptr_b); // 失败,返回 NULL // 检查下行转换是否成功 if (

1.5K10

浅析C++中的RTTI:运行时类型识别

使用方法 在C++中,我们通常使用两种主要的 RTTI 操作符:typeid 和 dynamic_cast。 typeid操作符 typeid 操作符用于获取一个对象/类型的类型信息。...操作符 dynamic_cast操作符用于在继承层次结构中进行安全的向下转型(基类向子类转换)。...如果转型不安全,dynamic_cast返回一个空指针(对于指针类型)或抛出std::bad_cast异常(对于引用类型)。...在使用dynamic_cast操作符时,务必进行适当的错误检查,以确保向下转型的安全性。 总结 运行时类型信息(RTTI)是C++语言中的一个强大特性,它允许我们在运行时获取对象的类型信息。...通过typeid操作符和dynamic_cast操作符,可以方便地进行类型查询和安全的向下转型。但使用RTTI时需要谨慎,以确保代码的性能和安全性。

7210

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

C.148: Use dynamic_cast to a pointer type when failure to find the required class is considered a valid...alternative C.148:使用dynamic_cast进行指针类型转换时,将不能发现目标类看作是有效的选项 Reason(原因) The dynamic_cast conversion allows...(item)) { view_of_evens.emplace_back(even); } if (auto trisym = dynamic_cast<...寻找所需类的失败会导致dynamic_cast返回一个空值,而解引用一个空指针会引起无定义的行为。因此应该总是认为dynamic_cast的结果可能为空并进行检查。...(复杂) 如果在dynamic_cast执行之后,没有对结果指针进行空判断,那么对使用这个指针的代码报警。

91310

RTTI和类型转换运算符

类型转换运算符 2.1 dynamic_cast 2.2 const_cast 2.3 static_cast 2.4 reinterpret_cast 1....dynamic_cast运算符将使用一个指向基类的指针来生成一个指向派生类的指针,否则,该运算符返回0—空指针。 typied运算符返回一个指出对象的类型的值。...1.1.1 dynamic_cast运算符 dynamic_cast运算符是RTTI中最常用的组件,其主要的功能是确定是否可以安全地将对地址赋给特定类型的指针,如果可以则返回该特定类型的指针,如果不可以则返回...可以理解为dynamic_cast可以用来类型转换,如果可安全转换,则转换成相应的类型指针,否则直接返回0(空指针)。...(bb)//毫无疑问派生类到基类的转换是安全的,该返回值类型即Base* BaseA* b2 = dynamic_cast(bs)//由于Base中无dispaly的实现

58430

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

(b); C++的新式强制类型转换 命名的强制类型转换具有如下形式: cast-name (expr); cast-name可以是:static_cast、const_cast、dynamic_cast...例如: int *ip;char *pc = reinterpret_cast(ip);//编译器虽然不报错,但是后果未定义string str(pc); 四、dynamic_cast dynamic_cast...语句的转换目标是指针类型且失败了,则结果为0 如果一条dynamic_cast语句的转换目标是引用类型且失败了,则dynamic_cast运算符抛出一个bad_cast异常 运行时类型识别(RTTI)的功能由两个运算符实现...指针类型的dynamic_cast 假设Base含有虚函数,且Derived是Base的公有派生类 如果有一个指向Base的指针bp,则我们可以在运行时将它转换成指向Derived的指针。...引用类型的dynamic_cast 引用类型的dynamic_cast与指针类型的dynamic_cast使用起来类似,只是两者在出错时的返回值不同: 引用类型的dynamic_cast在出错时会抛出异常

1.9K20

CC++开发基础——动态类型转换与RTTI

dynamic_cast运算符只能应用于多态类相关的指针和应用,且使用dynamic_cast的类需要至少包含一个虚函数。...二,dynamic_cast运算符使用介绍 dynamic_cast应用于指针类型的代码样式: *p_subclass = dynamic_cast *>( p_obj );...dynamic_cast应用于引用类型的代码样式: subclass = dynamic_cast &>( ref_obj ); 对比一下C语言中的强制类型转换的写法: Human...* phuman = new Men; Men* p = (Men*)(phuman); 以上写法无法判断是否转换成功,而dynamic_cast运算符可以检查转换是否成功: 对于指针类型的转换,dynamic_cast...RTTI中的dynamic_cast运算符可以让父类对象调用子类对象中的普通成员函数。 RTTI中使用dynamic_cast运算符和typeid运算符的相同前提条件:父类中至少有一个虚函数。

18810
领券