Effective C++: dynamic_cast.
2016-03-20 00:00
501 查看
dynamic_cast运算符
dynamic_cast用于将基类(base-class)的指针或者引用安全的转换成派生类的指针或者引用.
type必须是一个class(类类型),而且通常应该有虚函数,
上面的e必须满足下面两个条件中的一个才能转换:
1,e是type的公有派生类.
2,e是type的公有基类,或者即使type类型的.
16/4/9:
如果想要从基类向派生类转换使用static_cast是可以做到的但是派生类中的自身数据肯定会处于未定义状态的.
dynamic_cast<type*>(e); //e必须是一个有效的类类型的指针.
dynamic_cast<type&>(e); //e必须是一个有效的类类型的左值.
dynamic_cast<type&&>(e); //e必须是一个右值.
dynamic_cast用于将基类(base-class)的指针或者引用安全的转换成派生类的指针或者引用.
type必须是一个class(类类型),而且通常应该有虚函数,
上面的e必须满足下面两个条件中的一个才能转换:
1,e是type的公有派生类.
2,e是type的公有基类,或者即使type类型的.
#include <iostream> //#include <typeinfo>
class Object{ private: int number_=1; public: Object()=default; virtual ~Object()=default; explicit Object(const int& n_):number_(n_){ std::cout<<"----------"<<std::endl; } virtual void virtual_print()const { std::cout<<"virtual in Object: "<<this->number_<<std::endl; } void get_number()const noexcept { std::cout<<this->number_<<std::endl; } };
class Application : public Object { private: std::string str_; public: Application(const int& n_, const std::string& s_):Object(n_),str_(s_){} ~Application()=default; virtual void virtual_print()const override { std::cout<<"virtual in Application: "<<this->str_<<std::endl; } void print()const noexcept { std::cout<<this->str_<<std::endl; } };
void function(const Object& obj) { obj.get_number(); }
int main() { Application* app = new Application(520, "shihuawoaini"); Object* obj = app; //派生类向基类. obj->get_number(); //out: 520. std::cout<<std::boolalpha<< ((obj == app) ? true : false) <<std::endl; //out: true. Application* apps; //运行时才判断能不能成功转换. if(apps = dynamic_cast<Application*>(obj)){ //成功. 派生类到基类 再到 派生类 成功. apps->print(); //out: "shihuawoaini". apps->virtual_print(); //派生类中的该函数. } if(obj = dynamic_cast<Object*>(apps)){ //成功. 派生类到基类成功. obj->get_number(); //out: 520. obj->virtual_print();//派生类中的该函数. } Application* myApp; Object* myObj = new Object(999); //myApp = myObj; //error, 不能派生类向基类转换,有时候派生类基类关系比较复杂,那么这个时候dynamic_cast就派上用场了. if(myApp = dynamic_cast<Application*>(myObj)){ //false. std::cout<<"success"<<std::endl; //做一些其他事情. } else{ std::cout<<"fail"<<std::endl; //做一些其他事情. } delete app; app = nullptr; obj = nullptr; return 0; }
16/4/9:
如果想要从基类向派生类转换使用static_cast是可以做到的但是派生类中的自身数据肯定会处于未定义状态的.
相关文章推荐
- 八皇后问题深度遍历搜索
- RPI-设置-调试-文件传输
- C++虚函数及虚函数表解析
- C++虚函数与虚函数表
- C++中的虚函数(一)
- 蓝桥杯回朔算法之数字矩阵
- C++ 多态虚函数表(VS2013)
- 用C++实现杨辉三角
- C++二维数组(指针)做参数
- python下调用c语言代码
- C++中有个malloc/free,为什么还需要new/delete?
- c++发展趋势
- C++ typeid实现原理
- 【2016/3】C++ 类与对象进阶 运算符重载 new delete 模板 继承
- 理解C++的RTTI
- 在C语言中,double、long、unsigned、int、char类型数据所占字节数
- C++ RTTI及“反射”技术
- C++11中的Move语义和右值引用
- 利用委托加观察者模式实现老板状态变化通知C++
- C++实验2-模拟ATM