1.隐式类型转换
C++的隐式类型转换继承了C语言的基本数据类型的隐式转换,同时加入了派生类到基类的隐式转换。
隐式类型的转换主要用在赋值或者作为参数传递的时候,在兼容的类型之间的转换。
如果按照C++的思想,所有的操作都是函数(像+,=这些运算都是可以通过重载运算符来实现的),那总结起来就是一种用途:作为参数传递时:
class Base{
};
class Derived:public Base{
};
void func(const Base&)
{
}
int main()
{Derived d;func(d);return 0;
}
2.显式类型转换
显式类型转换又叫做“强制类型转换(cast)”,包含了隐式转换和隐式转换的相反过程。C++的显式类型转换和异常等一样,是C++的一个重要特性:继承了C的强制类型转换,同时加入了很多新鲜的控制。这个可以阅读BjarneStroustrup先生的C++自传《C++语言的设计和演化》一书,得到其历史渊源,里面对动态类型转换的讲解颇为详细,可以一看,在第二部分的cast一章。
2.1 C的强制类型转换
在基本的数据类型之间的转换就不多说了,这里主要介绍在类的继承体系中的指针或者引用之间的类型转换,下同。
C的类型转换规则非常简单,是在编译期决定的。编译器在编译时,获取基类和派生类之间的距离,然后就是通过加上或者减去这个距离值而得到新的指针。如果是没有任何关系的两个指针值之间的转换,则不作任何处理,地址相同。
#include <iostream>
using namespace std;class Base1{int a;
};
class Base2{int b;
};
class Derived: public Base1, public Base2{
};int main()
{Derived *pd = new Derived();Base2 *pb = new Base2();Base2 *pb1 = (Base2 *)pd;cout << "Derived: " << hex << pd << endl;cout << "Derived to Base2: " << pb1 << endl;Derived *pd1 = (Derived*)pb;cout << "Base: " << pb << endl;cout << "Base to Derived: " << pd1 << endl;int a;cout << "a : " << &a << endl;pb = (Base2 *)&a;cout << "Int to Base2: " << pb << endl;return 0;
}
运行结果如下:
Derived: 0x9f25008
Derived to Base2: 0x9f2500c
Base: 0x9f25018
Base to Derived: 0x9f25014
a : 0xbfb7f79c
Int to Base2: 0xbfb7f79c
从这个结果可以看出,这种
C方式的类型转换非常依赖于程序员的的嗅觉,哈哈。完全需要程序员对错误的转换杜绝,但是这种错误的转换又是没有一个判断依据的,所以,我们不能依赖于它来进行。
这里提一下,在正常的继承关系中的指针类型转换还有一种方式无法通过这种