1.const_cast
特性:1)可以去除变量的const 或者 volatile属性
void Type_transform::ConstCast()
{
const Test t;
t.s = "1111111"; //const 无法直接赋值 编译报错
Test &tt = const_cast<Test&>(t);
tt.s = "1111111111"; //使用const_cast转换后取出了const属性可以正常赋值
}
2.static_cast
静态类型转换,基础类型的转换,不支持完全没有关系的两个类之间进行转换。
特性:1)由子类转成父类没有问题,但由父类转成子类不安全
2)完全没有关系的两个类之间不可以进行转换。
void Type_transform::StaticCast()
{
Children *c = new Children;
qInfo() << "c" << c->getParent() << endl;
Parent *p = static_cast<Children*>(c); //子类转父类没有问题
qInfo() << "p" << p->getParent() << endl;
Parent *pp = new Parent;
Children *cc = static_cast<Children*>(pp);
if(cc != nullptr){
qInfo() << cc->getParent() << endl;
qInfo() << cc->getChildren() << endl; //父类转子类,调用子类成员函数时会出现问题
//(当然会有问题,父类根本没有子类的函数~~)
}
// Test *t = new Test;
// pp = static_cast<Parent *>(t); //完全不相关的类型不可以转换
delete c;
delete pp;
}
3.dynamic_cast
动态类型转换
特性:1)与static_cast相比,添加了由父类转为子类的检测,如果父类转换为子类会出错,返回一个空指针。
2)如果由父类转换为子类,父类一定要有虚函数,目的时可以生成虚函数表,让编译器知道父子类的关系,要不编译器会报错
void Type_transform::DynamicCast()
{
Children *c = new Children;
qInfo() << "c" << c->getParent() << endl;
Parent *p = dynamic_cast<Children*>(c); //子类转父类没有问题
qInfo() << "p" << p->getParent() << endl;
Parent *pp = new Parent;
Children *cc = dynamic_cast<Children*>(pp); //必须要有虚函数生成虚函数表,不然编译器报错
if(cc != nullptr){ //转换出错,返回nullptr
cc->getChildren();
}
delete c;
delete pp;
}
4.reinterpret_cast
仅重新解释类型,不知道有什么用(