面向对象编程技术的总结和理解(c++) (3)

只有当类型之间可隐式转换时(除类层次间的下行转化除外),static_cast的转换才是合法的。否则出错。类层次间的下行转化不能通过隐式转换完成。

使用static_cast完成下行转换(把基类指针或引用转换为子类指针或引用),由于没有动态类型检查,所以不安全。

c++的基本类型的指针之间不含隐式转换(除void*)需要显示转换。故char* 不能隐式转换为int*。

4)dynamic_cast

把expression转换为type类型的对象,type必须是类的指针,类的引用或void*

a.tpye和expression的类型需要一致,都为指针或引用。

与其他转换类型不同,dynamic_cast 涉及运行时类型检查,而这个运行时类型信息存储在类的虚函数表里,只有定义了虚函数的类才有虚函数表,对没有虚函数表的类在使用时会导致dynamic_cast编译错误。如果绑定到引用或指针的对象的类型不是目标类型,则dynamic_cast失败。如果转换到指针类型的dynamic_cast失败,则dynamic_cast的结果为0.如果转换到dynamic_cast失败,则抛出一个bad_cast类型的异常。dynamic_cast操作符执行两个操作。首先验证请求的转换是否有效,操作符执行的验证是在运行时进行的。

b.dynamic_cast主要用于类层次间的上行转换和下行转换

dynamic_cast运算符可以在执行期决定真正的类型。如果下行转换时安全的(基类的指针或引用执行一个派生类对象)这个运算符会传回转型过的指针。如果downcast不安全,这个运算符会传回空指针(基类的指针或引用没有指向一个派生类对象)

在类间进行上行转换时,dynamic_cast和static_cast的效果一样。

在类间进行下行转换时,dynamic_cast具有类型检查功能,比static_cast更加安全。

在运行dynamic_cast时必须包括多态类型。static_cast则没有这个限制。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzxxyf.html