c++中dynamic_pointer_cast强制类型转换
#include <iostream> #include <memory> using namespace std; class CBase { public: CBase() { } virtual ~CBase() { } void myBase() { cout << "CBase::myBase" << endl; } }; class CDerive : public CBase { public: CDerive() { } ~CDerive() { } void myDerive() { cout << "CDerive::myDerive" << endl; } }; int main(void) { //上行的转换(派生类到基类的转换) shared_ptr<CDerive> spDeriveUp; shared_ptr<CBase> spBaseUp; spDeriveUp = make_shared<CDerive>(); spBaseUp = dynamic_pointer_cast<CBase>(spDeriveUp); spBaseUp->myBase(); //下行的转换(基类到派生类的转换) shared_ptr<CDerive> spDeriveDown; shared_ptr<CBase> spBaseDown; spBaseDown = make_shared<CBase>(); spDeriveDown = dynamic_pointer_cast<CDerive>(spBaseDown); if (spDeriveDown == NULL) //由于会进行类型的检查,这边是返回NULL cout << "spDeriveDown is null" << endl; /* shared_ptr<CDerive> spDeriveDown; shared_ptr<CBase> spBaseDown; spBaseDown = make_shared<CDerive>(); spDeriveDown = dynamic_pointer_cast<CDerive>(spBaseDown); if (spDeriveDown == NULL) //由于会进行类型的检查,这边是返回NULL cout << "spDeriveDown is null" << endl; spDeriveDown->myDerive(); */ return 0; }
运行结果:
#include <iostream> #include <memory> using namespace std; class CBase { public: CBase() { } virtual ~CBase() { } void myBase() { cout << "CBase::myBase" << endl; } }; class CDerive : public CBase { public: CDerive() { } ~CDerive() { } void myDerive() { cout << "CDerive::myDerive" << endl; } }; int main(void) { //上行的转换(派生类到基类的转换) shared_ptr<CDerive> spDeriveUp; shared_ptr<CBase> spBaseUp; spDeriveUp = make_shared<CDerive>(); spBaseUp = dynamic_pointer_cast<CBase>(spDeriveUp); spBaseUp->myBase(); //下行的转换(基类到派生类的转换) /* shared_ptr<CDerive> spDeriveDown; shared_ptr<CBase> spBaseDown; spBaseDown = make_shared<CBase>(); spDeriveDown = dynamic_pointer_cast<CDerive>(spBaseDown); if (spDeriveDown == NULL) //由于会进行类型的检查,这边是返回NULL cout << "spDeriveDown is null" << endl; */ shared_ptr<CDerive> spDeriveDown; shared_ptr<CBase> spBaseDown; spBaseDown = make_shared<CDerive>(); spDeriveDown = dynamic_pointer_cast<CDerive>(spBaseDown); if (spDeriveDown == NULL) //由于会进行类型的检查,这边是返回NULL cout << "spDeriveDown is null" << endl; spDeriveDown->myDerive(); return 0; }
运行结果:
一些结论:
子类向基类转是一定没有问题的。基类转子类的话,必须基类的动态类型与要转换的子类一致。