-- static_cast
用于类层次结构中基类和子类之间转换。(基类和子类之间的转换通常建议用dynamic_cast)
进行上行转换(把子类的指针转换成基类)是安全的;
进行下行转换(把基类的指针转换成子类)时,由于没有动态类型检查,所以是不安全的。
用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。
-- dynamic_cast
用于类层次结构中基类和子类之间的转换
进行上行转换(把子类的指针转换成基类)时, dynamic_cast和static_cast的效果是一样的;
进行下行转换(把基类的指针转换成子类)时, dynamic_cast具有类型检查的功能,
比static_cast更安全。但是要求类必须有虚函数表, 这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表。
所以在进行类的:
上行转换时, static_cast和dynamic_cast是一样的, 都是安全的
下行转换时, static_cast是不安全的; dynamic_cast是安全的, 但是要求基类包含虚函数表。
相同父类的子类之间进行转换, static_cast和dynamic_cast都是不可以的
static_cast:直接编译就报错
dynamic_cast: 如果没有虚函数表, 就直接编译报错
: 如果有虚函数表, 编译不报错, 但是转换后的值是NULL
-- const_cast
常量指针被转化成非常量指针
class A
{
public:
int i;
};
int main(int argc, char *argv[])
{
A * a = new A();
a->i = 10;
const A * b = const_cast<A *>(a);
//b->i = 10; // compile error "The left operand cannot be assigned to."
A * c = const_cast<A *>(b);
c->i = 10;
}
-- reinterpret_cast
随你怎么解释, 举个例子
可以看到reinterpert_cast<>可以成功, 剩下的static_cast和dynamic_cast都不能成功。
但是reinterpert_cast非常危险, 举个例子如果父类不含虚函数, 而子类含有虚函数, 那么这两个类不能用reinterpert_cast进行转换
执行输出结果如下:
c1->a=1, c1->b=2
c2->a=1, c2->b=2, c2->c=3
c3->a=2
c4->a=137256
可以看出(c3,c4)上行和下行的转换都是失败的。
如果用C2 *c3 = (C2 *)(c1);转换, 上行下行都是成功的, 即能正确输出值1.
dd