// 上行 Sub -> Base //编译通过,安全 Sub sub; Base *base_ptr = static_cast<Base*>(&sub); //下行 Base -> Sub //编译通过,不安全 Base base; Sub *sub_ptr = static_cast<Sub*>(&base);
dynamic_cast
c++ 多态性,例如在基类中定义一个虚函数,然后 子类 继承这个类并 实现虚函数,不同的子类可以有不同的虚函数实现。当我们将基类的指针指向子类的对象时,就会自动调用 对应子类的 虚函数的实现,这就体现出了多态性。
这个类型转换是 C 语言替代不了的 因为涉及到 C++ 的多态特性。对于C++ 中的类 的子类 和 基类 之间的指针或引用的转换,因该用dynamic 或者 static 转换。
virtualvoidi_am_virtual_foo(){} }; intmain(){ cout << "Sub->Base" << endl; Sub * sub = newSub(); sub->print(); Base* sub2base = dynamic_cast<Base*>(sub); if (sub2base != nullptr) { sub2base->print(); } cout << "<sub->base> sub2base val is: " << sub2base << endl;
cout << endl << "Base->Sub" << endl; Base *base = newBase(); base->print(); Sub *base2sub = dynamic_cast<Sub*>(base); if (base2sub != nullptr) { base2sub->print(); } cout <<"<base->sub> base2sub val is: "<< base2sub << endl;
delete sub; delete base; return0; } /* vs2017 输出为下 Sub->Base I'm Sub I'm Base <sub->base> sub2base val is: 00B9E080 // 注:这个地址是系统分配的,每次不一定一样 Base->Sub I'm Base <base->sub> base2sub val is: 00000000 // VS2017的C++编译器,对此类错误的转换赋值为nullptr */
reinterpret_cast
强制类型转换符用来处理无关类型转换的 (例如指针 和 long long(64位机器指针是八字节) 的转换)