Effective C++: dynamic_cast.

dynamic_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是可以做到的但是派生类中的自身数据肯定会处于未定义状态的.

转载于:https://my.oschina.net/SHIHUAMarryMe/blog/644103

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值