您的位置:首页 > 编程语言 > C语言/C++

Effective C++: dynamic_cast.

2016-03-20 00:00 501 查看
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是可以做到的但是派生类中的自身数据肯定会处于未定义状态的.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: