这是2013年写的一篇旧文,放在gegahost.net上面 http://raison.gegahost.net/?p=39

February 20, 2013

casting in C++

Filed under: c++ — Tags: C++ internal, dynamic_cast, reinterpret_cast, static_cast — Raison @ 6:17 am

(original work by Peixu Zhu)

Unlike in C language, C++ language offers richer casting features, however, at the same time, it also brings complexity.

Keep in mind that in C++, casting may return a different address rather than the original one !

1.  static_cast

  • mainly focus on syntax checking at compile time, it can be used to cast a base class into a derived class.
  • if it fails, the compiler will give error information.
  • in case of casting from a class with multiple parent class, it may return an address offset to the sourcing address. However, casting to void* will not change the address.

2.  dynamic_cast

  • when it fails, it will return NULL value at run time.
  • in case of casting from a class with multiple parent class, it may return an address offset to the sourcing address. However, casting to void* will not change the address.

3.  reinterpret_cast

  • will not change returned pointers.
  • the target must have enough size to accept the source value.

4.  casting classes with multiple parent classes

  • for force casting/static_cast/dynamic_cast, if the casted class has more than one parent classes, the result may be not the original address, but an address having an offset to the original address. However, though the resulted address is different to the original address, comparative operator will restore the original address temporary, in case of compare to the pointer of original class. That is, the compiler will make both pointer to be the same class type in memory layout.
  • However, if the pointer is casted to void*, it will not change the sourcing address.

5.  internal of static_cast/dynamic a derived class which has multiple parent classes into a base class:

  • get the address of the derived instance.
  • if the address is zero, return it.
  • if the address is non-zero, compiler will return an address with an offset to the instance address.

6.  `==’ operator on two pointers of which one is subobject of another one.

  • the compiler check whether the subobject one is non-zero, if it is non-zero, promote it like another one, by changing it’s address temporarily with an offset.
  • when the two pointers are compared, compiler will temporary `upgrade’ the subobject to same grade class, then perform the comparison, and if the pointer is NULL, the upgrade is not necessary and then omitted.

casting in C++的更多相关文章

  1. 读书笔记 effective c++ Item 27 尽量少使用转型(casting)

    C++设计的规则是用来保证使类型相关的错误不再可能出现.理论上来说,如果你的程序能够很干净的通过编译,它就不会尝试在任何对象上执行任何不安全或无意义的操作.这个保证很有价值,不要轻易放弃它. 不幸的是 ...

  2. Laravel attribute casting 导致的 Indirect modification of overloaded property

    在 Laravel model 中,设置了某个属性做 array casting. protected $casts = [ 'rounds' => 'array', ]; 但是在 contro ...

  3. C++进阶--显式类型转换(casting)

    //############################################################################ /* * 显式类型转换 * * 类型转换 ...

  4. Reference Type Casting

    5.5.1. Reference Type Casting Given a compile-time reference type S (source) and a compile-time refe ...

  5. Welcome-to-Swift-18类型转换(Type Casting)

    类型转换是一种检查类实例的方式,并且哦或者也是让实例作为它的父类或者子类的一种方式. Type casting is a way to check the type of an instance, a ...

  6. java中Number Type Casting(数字类型强转)的用法

    4.5 Number Type Casting(数字类型强转)隐式 casting(from small to big) byte a = 111; int b = a;显式 casting(from ...

  7. 关于“No loop matching the specified signature and casting was found for ufunc lstsq_n”问题的解决

    下面这段代码是使用MatPlotLib绘制数据随时间变化的趋势. import datetime as dt import numpy as np import pandas as pd import ...

  8. system verilog中的类型转换(type casting)、位宽转换(size casting)和符号转换(sign casting)

    类型转换 verilog中,任何类型的任何数值都用来给任何类型赋值.verilog使用赋值语句自动将一种类型的数值转换为另一种类型. 例如,当一个wire类型赋值给一个reg类型的变量时,wire类型 ...

  9. 对象转型 casting

    一个基类的引用类型变量可以"指向"其子类对象. 一个基类的引用不可以访问其子类对象新增加的成员(属性和方法). 基类强制转型成子类,则能访问子类独有的成员. 可以使用 引用变量in ...

随机推荐

  1. 一步一步学Silverlight 2系列(16):数据与通信之JSON

    概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...

  2. maven实战(1)-- maven仓库

    maven仓库配置 转自:http://blog.csdn.net/dongnan591172113/article/details/7685164 1.两类仓库 1.1本地仓库(local repo ...

  3. OpenCV——PS滤镜算法之 Ellipsoid (凸出)

    // define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED #include < ...

  4. SPOJ:Harbinger vs Sciencepal(分配问题&不错的DP&bitset优化)

    Rainbow 6 is a very popular game in colleges. There are 2 teams, each having some members and the 2 ...

  5. POJ2976:Dropping tests(01分数规划入门)

    In a certain course, you take n tests. If you get ai out of bi questions correct on test i, your cum ...

  6. apple-touch-startup-image 制作iphone web应用程序的启动画面

    为ipad制作web应用程序的启动画面时发现个问题,只能显示竖屏图,横屏图出不来,如下: 首先页面头部里要加入(这个是APP启动画面图片,如果不设置,启动画面就是白屏,图片像素就是手机全屏的像素) & ...

  7. Struts2基本使用

    Struts2:本质servlet 1.接受页面参数 a.使用原生的ServletAPI接受(不推荐) request.getParameter(name) 获取元素request方式: --Http ...

  8. 51nod 1489 蜥蜴和地下室(dp)

    传送门 题意 分析 dp[12][20][20][20]; // dp[a][b][c][d]第a个弓箭手面临第a-1.a.a+1个弓箭手的生命值分别为b.c.d的状态 转移巧妙,需注意 trick ...

  9. bzoj3195: [Jxoi2012]奇怪的道路(状压dp)

    Description 小宇从历史书上了解到一个古老的文明.这个文明在各个方面高度发达,交通方面也不例外.考古学家已经知道,这个文明在全盛时期有n座城市,编号为1..n.m条道路连接在这些城市之间,每 ...

  10. jQuery中$.getJSON

    $.getJSON $.getJSON()是专门为ajax获取json数据而设置的,并且支持跨域调用,其语法的格式为: $.getJSON( url, //请求URL [data], //传参,可选参 ...