特性: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属性可以正常赋值 }
静态类型转换,基础类型的转换,不支持完全没有关系的两个类之间进行转换。
特性: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; }
动态类型转换
特性: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; }
仅重新解释类型,不知道有什么用(