类型转换表达式(CONVERSIONS)
来源:互联网 发布:tp框架数据库修改语句 编辑:程序博客网 时间:2024/06/06 08:48
类型转换表达式(CONVERSIONS)
一、dynamic_cast conversion
将指针或引用,沿着继承层次(inheritance hierarchy) 向上、向下安全转型。当 new_type
是指针类型时, 如果转换失败, 则返回 nullptr
, 当 new_type
是引用类型时, 如果转换失败, 则抛出异常。使用方式如下:
dynamic_cast<new_type> (expression)
只有当下列转换不移除变量的 const
和 volatile
性质时, 才使用 dynamic_cats
:
expression
正好是new_type
类型的变量, 或者new_type
是expression
的类型加上了 cv限定符(cv-qualifier) 。(也就是说,dynamic_cast
可以用来加 cv限定符。隐式转换(implicit cast) 和static_cast
也可以用来实现该功能)
其返回值是new_type
类型, 值是expression
的值。experssion
是空指针。
其返回值是new_type
类型的空指针。new_type
是指向Base
的指针或者引用,expression
的类型是指向Derived
的指针或引用(其中Base
是Derived
唯一的、accessible 基类。【译者注: accessible 在这里实在不好翻译和解释。 这么说吧, 当子类private
继承基类时, 这个基类就是该子类的inaccessible base
, 这个基类就不能向上转型为该基类】)。(隐式转换(implicit cast) 和static_cast
也可以用来实现该功能)
其返回值是基类指针或引用类型。expression
是指向多态类型的指针或引用,new_type
是void*
类型。
返回值是void*
类型, 值是最底层的子类对象(the most derived object)的地址。如:
#include <iostream>using namespace std;class Base {public: virtual void func() { }};class Base1 {public: virtual void func1() { }};class Derived : public virtual Base, public virtual Base1{public:};int main() { Derived* p = new Derived; cout << "Derived: " << hex << p << endl; cout << "--------------------------------" << endl; Base* pb = dynamic_cast<Base*>(p); cout << "Derived->Base: " << hex << pb << endl; Base1* pb1 = dynamic_cast<Base1*>(p); cout << "Derived->Base1: " << hex << pb1 << endl; cout << "--------------------------------" << endl; void* vpb = dynamic_cast<void*>(pb); cout << "Derived->Base->void: " << hex << vpb << endl; void* vpb1 = dynamic_cast<void*>(pb1); cout << "Derived->Base1->void: " << hex << vpb1 << endl; return 0;}
输出结果:
Derived: 0x1b14f0--------------------------------Derived->Base: 0x1b14f0Derived->Base1: 0x1b14f8--------------------------------Derived->Base->void: 0x1b14f0Derived->Base1->void: 0x1b14f0
- 如果
expression
的类型是指向多态类型Base
的指针或引用,new_type
是指向Derived
类型的指针或引用, 将会进行运行时检查(run-time check):
a)expression
指向的类型(Base)是Derived
的public
继承的基类。返回结果是Derived
类型指针/引用。(downcast)
b)expression
指向的类型(Base)是某个类MostDerived
的一个public
基类, 同时,new_type
指向的类型(Derived)是MostDerived
的一个public
基类(译者注: 并且要求,Derived
既不是Base
的子类, 也不是它的基类)。 返回结果是Derived
类型指针/引用。(sidecast)
c) 否则, 运行时检查(run-time check) 失败。 如果dynamic_cast
使用在指针上, 则new_type
类型的空指针, 否则抛出异常。 dynamic_cast
被直接或间接用在构造或析构函数, 并且expression
指向的正是当前正在构造/析构的对象。 但是, 如果new_type
不是指向正在构造/析构的对象本身的类型或它的基类, 那么该行为是未定义的。
[未完待续…]
二、 参考文献
- cppreference.com
1 0
- 类型转换表达式(CONVERSIONS)
- 类型转换一:Type conversions One:
- C语言类型转换(type conversions in C)
- C++中类型转换(Type Conversions in C++)
- 效率: 条款21 利用重载技术避免隐式类型转换(implicit type conversions)
- c++表达式--类型转换
- 表达式类型的转换
- 表达式类型转换问题
- 数据类型、表达式 类型转换
- 表达式的类型转换
- Java表达式类型转换
- HDOJ(HDU) 1985 Conversions(汇率转换)
- js表达式中的类型转换
- [翻译] Effective C++, 3rd Edition, Item 46: 需要 type conversions(类型转换)时在 templates(模板)内定义 non-member functions(非成员函数)
- C++ 隐式类类型转化 Implicit Class-Type Conversions
- C++ 表达式中 类型的转换
- MYSQL表达式求值和MYSQL类型转换
- OGNL表达式,值栈(ValueStack),类型转换
- 递归-动物生崽问题
- r.js的使用
- centos6.5下安装mysql出错的问题
- 多线程学习
- 关于ASP.NET Web Api的HelpPage文档注释问题
- 类型转换表达式(CONVERSIONS)
- 安装解压版MySQL5.76及以上版本 出现服务正在启动-服务无法启动的问题
- CTS Verifier测试
- 汇编输入字符串常见的实验题
- 机器学习第三章复习(1)
- IE中CSS-filter滤镜小知识大全
- Restful风格API接口开发springMVC篇
- iMindMap8在安装时出现1018错误怎么解决
- iOS中assign,copy,retain之间的区别以及weak和strong的区别