c++ --> c++中四种类型转换方式
用法:static_cast < type-id > ( exdivssion )
用法:dynamic_cast < type-id > ( exdivssion )
class B{
public:
int m_iNum;
virtual void foo();
};
class D:public B{
public:
char *m_szName[];
};
void func(B *pb){
D *pd1 = static_cast(pb);
D *pd2 = dynamic_cast(pb);
}
class A{
public:
int m_iNum;
virtual void f(){}
};
class B:public A{
};
class D:public A{
};
void foo(){
B *pb = new B;
pb->m_iNum = ;
D *pd1 = static_cast(pb); //compile error
D *pd2 = dynamic_cast(pb); //pd2 is NULL
delete pb;
}
用法:reinterpret_cast < type-id > ( exdivssion )
int i;
char *p = "This is a example.";
i = reinterpret_cast<int>(p);
此时结果,i与p的值是完全相同的。reinterpret_cast的作用是说将指针p的值以二进制(位模式)的方式被解释为整型,并赋给i,一个明显的现象是在转换前后没有数位损失。
用法:const_cast < type-id > ( exdivssion )
class B{
public:
int m_iNum;
}
void foo(){
const B b1;
b1.m_iNum = ; //comile error
B b2 = const_cast(b1);
b2. m_iNum = ; //fine
}
六、dynamic_cast举例
1)如果type-id是expression的直接或间接基类指针,结果将是指向该expression实体的type-id类型指针。这称作"upcast"。比如:
class B {...};
class C : public B {...};
class D : public C {...};
void f (D *pD)
{
C* pc = dynamic_cast<C*>(pD); // ok
B* pb = dynamic_cast<B*>(pD); // ok
}
2)如果type-id是void *,那么运行时将检查expression的实际类型。其结果是指向expression完整实体的一个指针。如:
class A { ... };
class B { ... };
void f()
{
A* pa = new A;
B* pb = new B;
void* pv = dynamic_cast<void*>(pa);
// pv指向A一个对象
...
pv = dynamic_cast<void*>(pb);
// pv 指向 B的一个对象
}
3)如果type-id不是void *,将在运行时检查expression对象是否可以被转型为type-id。
a. 如果expression是type-id的一个基类,那么将在运行时检查expression是否指向type-id一个完整对象。如果是,结果就是该对象的指针;否则出错。如:
class B {...};
class D : public B {...};
void f()
{
B *pB = new D;
B *pB2 = new B;
D *pD = dynamic_cast<D*> (pB); // ok.
D *pD2 = dynamic_cast<D*> (pB2) // error.
}
上面称作"downcast"
b. 如果是多重继承,比如:
class A {...};
class B : public A {...}; // B继承自A
class C : public A {...}; // C继承自A
class D : public B, public C {...}; // D继承自B, C
//此时指向D的指针可以安全的cast为B或者C(见上),不过如果将其cast到A该怎么办呢?这样吗?
D *pD = new D;
A *pA = dynamic_cast <A*> (pD); //error.不知道指向哪个A.
//这时我们可以先转型为B(或C),然后间接批向A。如下
B *pB = dynamic_cast <B*> (pD);
A *pA = dynamic_cast <A*> (pB); // ok
c. 虚拟继承的情况
class A {...} // 以后就直接简写作class name了
class B : vitual public A;
class C : public B;
class D : public B;
class E : publc C, public D;
class A;
class B : public A;
class C : public A;
class D;
class E : public B, public C, publc D;
void f (D *pD)
{
E *pE = dynamic_cast <E*> (pD);
B *pB = dynamic_cast <B*> (pE);
// 或者 B *pB = pe;
A *pA = dynamic_cast <A*> (pB);
// or A *pA = pB;
}
e. (十字)交叉转换(cross cast)。如上例中从B(或子类)与D(或子类)的互相转型。
c++ --> c++中四种类型转换方式的更多相关文章
- C++中四种类型转换方式(ynamic_cast,const_cast,static_cast,reinterpret_cast)
Q:什么是C风格转换?什么是static_cast, dynamic_cast 以及 reinterpret_cast?区别是什么?为什么要注意? A:转换的含义是通过改变一个变量的类型为别的类型从而 ...
- C++中四种类型转换方式
类型转换有c风格的,当然还有c++风格的.c风格的转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可以在任意类型之间转换,比 ...
- 【转】C++四种类型转换方式
C++四种类型转换方式 https://blog.csdn.net/lv_amelia/article/details/79483579 C风格的强制类型转换(Type Case)很简单,不管什么类型 ...
- 【C++】类型转换简述:四种类型转换方式的说明及应用
本文主要简述在C++中四种类型转换的方式:static_cast.reniterpret_cast.const_cast和dynamic_cast. 在介绍C++类型转换方式之前,我们先来看看C语言的 ...
- [转]C++中四种类型转换符的总结
C++中四种类型转换符的总结 一.reinterpret_cast用法:reinpreter_cast<type-id> (expression) reinterpret_cast操 ...
- C++中四种类型转换以及const_cast是否能改变常量的问题
we have four specific casting operators:dynamic_cast, reinterpret_cast, static_cast and const_cast. ...
- Web.xml中四种验证方式
源地址:https://blog.csdn.net/imimi_/article/details/78805642 <security-constraint> 的子元素 <http- ...
- C++四种类型转换方式。
类型转换有c风格的,当然还有c++风格的.c风格的转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可以在任意类型之间转换,比 ...
- OC中四种遍历方式
标准的C语言for循环.Objective-C 1.0出现的NSEnumerator.Objective-C 1.0出现的for in快速遍历.块遍历. 遍历的话,一般是NSArray.NSDicti ...
随机推荐
- Java中字符串的一些常见方法
1.Java中字符串的一些常见方法 /** * */ package com.you.model; /** * @author Administrator * @date 2014-02-24 */ ...
- 如何修改WinPE Boot的.wim镜像文件
1. 使用imagex /apply或imagex /mountrw将WIM镜像文件mount到某个文件夹,假设为d:\tmp\winpe_x86\mount. 例: imagex /mountrw ...
- [2015-06-10 20:53:50 - Android SDK] Error when loading the SDK:
1.错误描述 [2015-06-10 20:53:50 - Android SDK] Error when loading the SDK: Error: Error parsing D:\Andro ...
- Adobe RIA 开发工程师认证考试大纲
AdobeRIA 开发工程师认证考试大纲 考题数量:共90道题,考试通过正确率:60% 考试时间:120分钟 试题种类:单选题.多选题和判断题 1. Adobe RIA基础知识(2道题) ...
- Django学习-23-ModelForm
Model + Form ----> 验证 + 数据库操作 class UserInfo(models.Model): username = models.CharField(max_lengt ...
- 权限的分类(shiro项目中来的五)
第一种权限:菜单栏展示还是不展示的权限(粗颗粒) 实现方法,在SYS_ROLE表中添加一个字段rights,通过 public static BigInteger sumRights(String[] ...
- CentOS7.2编译安装PHP7.2.3之史上最详细步骤。
首先,我们的CentOS版本信息如下: 开始我们的编译. 第一步: 将php安装包安装到/usr/src目录下. cd /usr/src && wget http://cn2.php. ...
- Weex 初探
Weex 初探 Weex 介绍 Weex 是阿里于 2016 年开源的一款开发框架,它的介绍是: Weex 是一个使用 Web 开发体验来开发高性能原生应用的框架. 它使用了 Web 技术来开发 An ...
- BZOJ 2969: 矩形粉刷(期望)
BZOJ 2969: 矩形粉刷(期望) 题意: 给你一个\(w*h\)的方阵,不断在上面刷格子.每次等概率选择方阵中的两个点(可以相同)将以这两个点为端点的矩形(边平行于矩形边界)进行染色.共染\(k ...
- [BZOJ4198] [Noi2015] 荷马史诗 (贪心)
Description 追逐影子的人,自己就是影子. ——荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是 ...