在CPP中的强制转换有static_cast,reinterpret cast和dynamic_cast等。 两种风格上的类型,CPP风格会去做一些类型检测,从而相对c风格会安全一点。 今天来学习一下dynamic_cast。 C++中的dynamic_cast中相对旧式转换的安全性体现 首先,dynamic_cast专门用于继承结构(基类和子类)中的类型转换。 这里先
1)static_cast :编译时期的静态类型检查 static_cast < type-id > ( expression ) 该运算符把expression转换成type-id类型,在编译时使用类型信息执行转换,在转换时执行必要的检测(指针越界、类型检查),其操作数相对是安全的 2)dynamic_cast:运行时的检查 用于在集成体系中进行安全的向下转换downcast,即基类指针/引...
size(); ++i) { shapes[i]->draw(); if(dynamic_cast<circle*>(shapes[i])) Ncircles++; if(dynamic_cast<ellipse*>(shapes[i])) Nellipses++; if(dynamic_cast<rectangle*>(shapes[i])) Nrects++; if(dynamic_cast<shape*>(shapes[i])) Nshapes++; cout<<"dynamic_cast:"<<Nshapes<<endl;...
dynamic_cast主要用于在多态的时候,它允许在运行时刻进行类型转换,从而使程序能够在一个类层次结构中安全地转换类型,把基类指针(引用)转换为派生类指针(引用)。 当类中存在虚函数时,编译器就会在类的成员变量中添加一个指向虚函数表的vptr指针,每一个class所关联的type_info object也经由virtual table被指出来,通常...
1)If the type ofexpressionis exactlytarget-typeor a less cv-qualified version oftarget-type, the result is the value ofexpressionwith typetarget-type. In other words,dynamic_castcan be used toadd constness. An implicit conversion andstatic_castcan perform this conversion as well. ...
static_cast,非多态类型的转换,不执行运行时类型检查,通常来说只用于转换数值数据类型,可以实现子类的向上转换; dynamic_cast,用于多态类型的转换,转换时进行类型检查,只适用于指针或引用,不明确的指针的转换会返回空指针但不引发异常,可以实现向上转换或者向下转换; const_cast,取消const的只读语义; reinterpret_cast,...
dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。 在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的; 在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。 class B{ public: int m_iNum; ...
static_cast,非多态类型的转换,不执行运行时类型检查,通常来说只用于转换数值数据类型,可以实现子类的向上转换;dynamic_cast,用于多态类型的转换,转换时进行类型检查,只适用于指针或引用,不明确的指针的转换会返回空指针但不引发异常,可以实现向上转换或者向下转换;const_cast,取消const的只读语义;reinterpret_cast,对位的...
16、dynamic_cast:强制将一个类型转化为另一种类型,并且在运行时检查它,保证它的合法性 17、else:用在if语句中的二选一 18、enum:用来创建一个包含多个名称元素的名称表 19、explicit:当构造函数被指定时,将不会自动把构造函数作为转换构造函数 20、extern:用来告知编译器变量在当前范围之外声明过了 ...
dynamic_cast异常 std::bad_exception 无法预期的异常 std::bad_typeid typeid异常 std::logic_error 读取代码来检测到的异常 std::domain_error 使用了一个无效的数学域时,会抛出该异常 std::invalid_argument 使用了无效的参数时,会抛出该异常 std::length_error 创建了太长的 std::string 时,会抛出该异常 ...