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 ...
随机推荐
- 制作U盘启动CDLinux
用U盘启动CDLinux的好处就此不必多说了,直接上料: 下载必需文件: 1,CDLinuxU盘启动制作工具:CDLinuxU盘启动制作工具 2,CDlinux 0.9.7 集_奶瓶_打气筒_mini ...
- Linux显示工作路径
Linux显示工作路径 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ pwd /home/youhaidong
- Java中的List转换成JSON报错(五)
1.错误描述 Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/beanu ...
- 存储过程 100w提交
create or replace procedure largedata_insert(ip_table_name in varchar2, --目标表 ip_table_column in v ...
- LCT总结(LCT,Splay)
概念.性质简述 LCT(Link-Cut Tree),就是动态树的一种,用来维护一片森林的信息,滋磁的操作可多啦! 动态连边.删边 合并两棵树.分离一棵树(跟上面不是一毛一样吗) 动态维护连通性 维护 ...
- Vue-开发工具的安装
1. github官网下载vue工具:https://github.com/vuejs/vue-devtools.并解压 2. 在有package.json的文件夹下,按住shift右键,选择&qu ...
- 百度统计&友盟统计
一.百度统计 登录百度站长统计账号-->管理 --->代码获取-->复制代码,如 <script> var _hmt = _hmt || []; (function() ...
- 9.C++-对象的构造函数(详解)
大家都定义struct或class时,不能给成员直接赋值,那么对象中成员变量的初始值是多少? 对于局部对象变量而言,其成员是个随机值,因为该变量是被分配在栈上,对于其它局部变量也是这样. 对于全局对象 ...
- 【python学习笔记】7.更加抽象
[python学习笔记]7.更加抽象 类的定义就是执行代码块 在内存保存一个原始实例,可以通过类名来访问 类的实例化,是创建一个原始实例的副本, 并且所有成员变量与原始实例绑定 通过修改实例变量,可以 ...
- Problem : 1022 ( Train Problem I )
做题思路必须很清晰啊....可以用数组存储in或out来着,第一次C++用string啊,效果还行 Problem : 1022 ( Train Problem I ) Judge Status : ...