东方耀AI技术分享
标题:
智能指针的转换,向上才是安全的,向下用dynamic_pointer_cast
[打印本页]
作者:
东方耀
时间:
2021-10-13 10:13
标题:
智能指针的转换,向上才是安全的,向下用dynamic_pointer_cast
智能指针的转换,向上才是安全的,向下用dynamic_pointer_cast
#include <iostream>
#include <memory>
using namespace std;
class CBase
{
public:
CBase() { }
virtual ~CBase() { }
void myBase()
{
std::cout << "基类CBase::基函数myBase" << endl;
}
int my_id = 0;
};
class CDerive : public CBase
{
public:
CDerive() { }
~CDerive() { }
void myDerive()
{
std::cout << "子类CDerive::子类的函数myDerive" << endl;
}
int my_id = 1;
};
int main(){
std::cout << "智能指针的转换!\n";
std::shared_ptr<CBase> spr_base_class;
std::shared_ptr<CDerive> spr_sub_class;
spr_base_class->myBase();
// std::cout << "只是申明了共享指针啊:" << spr_base_class->my_id << endl;
spr_sub_class->myDerive();
// spr_sub_class->myBase();
std::cout << "子类共享指针的引用次数:" << spr_sub_class.use_count() << endl;
spr_sub_class = make_shared<CDerive>();
// spr_sub_class =
std::cout << "子类共享指针的引用次数(才真正管理资源):" << spr_sub_class.use_count() << endl;
spr_base_class = make_shared<CBase>();
std::cout << "分配内存了:基类id=" << spr_base_class->my_id << endl;
std::cout << "分配内存了:子类id=" << spr_sub_class->my_id << endl;
//子类的共享指针去获取基类的id 派生类到基类的转换
// std::shared_ptr<CBase> spr = static_pointer_cast<CBase>(spr_sub_class);
std::shared_ptr<CBase> spr = dynamic_pointer_cast<CBase>(spr_sub_class);
std::cout << "子类的共享指针去获取基类的id=" << spr->my_id << endl;
//基类到派生类的转换)这是不安全的
//只是dynamic_cast在进行下行转换的时候(即基类到派生类)具有类型检查功能,而static_cast没有
// //由于会进行类型的检查,这边是返回NULL
// const_pointer_cast 还有一个这个
return 0;
// 智能指针的转换,向上才是安全的,向下用dynamic_pointer_cast
}
复制代码
作者:
zouqiqi
时间:
2021-11-23 19:26
让天下人人学会人工智能!人工智能的前景一片大好!
欢迎光临 东方耀AI技术分享 (http://ai111.vip/)
Powered by Discuz! X3.4