东方耀AI技术分享

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 1146|回复: 1
打印 上一主题 下一主题

[C/C++] 智能指针的转换,向上才是安全的,向下用dynamic_pointer_cast

[复制链接]

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14441
QQ
跳转到指定楼层
楼主
发表于 2021-10-13 10:13:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式





智能指针的转换,向上才是安全的,向下用dynamic_pointer_cast




  1. #include <iostream>
  2. #include <memory>

  3. using namespace std;


  4. class CBase
  5. {
  6. public:
  7.         CBase() { }
  8.         virtual ~CBase() { }

  9.         void myBase()
  10.         {
  11.                 std::cout << "基类CBase::基函数myBase" << endl;
  12.         }
  13.     int my_id = 0;
  14. };

  15. class CDerive : public CBase
  16. {
  17. public:
  18.         CDerive() { }
  19.         ~CDerive() { }

  20.         void myDerive()
  21.         {
  22.                 std::cout << "子类CDerive::子类的函数myDerive" << endl;
  23.         }
  24.     int my_id = 1;
  25. };


  26. int main(){
  27.     std::cout << "智能指针的转换!\n";
  28.     std::shared_ptr<CBase> spr_base_class;
  29.     std::shared_ptr<CDerive> spr_sub_class;

  30.     spr_base_class->myBase();   
  31.     // std::cout << "只是申明了共享指针啊:" << spr_base_class->my_id << endl;
  32.     spr_sub_class->myDerive();
  33.     // spr_sub_class->myBase();
  34.     std::cout << "子类共享指针的引用次数:" << spr_sub_class.use_count() << endl;
  35.     spr_sub_class = make_shared<CDerive>();
  36.     // spr_sub_class =
  37.     std::cout << "子类共享指针的引用次数(才真正管理资源):" << spr_sub_class.use_count() << endl;
  38.     spr_base_class = make_shared<CBase>();

  39.     std::cout << "分配内存了:基类id=" << spr_base_class->my_id << endl;
  40.     std::cout << "分配内存了:子类id=" << spr_sub_class->my_id << endl;

  41.     //子类的共享指针去获取基类的id   派生类到基类的转换
  42.     // std::shared_ptr<CBase> spr = static_pointer_cast<CBase>(spr_sub_class);
  43.    
  44.     std::shared_ptr<CBase> spr = dynamic_pointer_cast<CBase>(spr_sub_class);
  45.     std::cout << "子类的共享指针去获取基类的id=" << spr->my_id << endl;
  46.     //基类到派生类的转换)这是不安全的  
  47.     //只是dynamic_cast在进行下行转换的时候(即基类到派生类)具有类型检查功能,而static_cast没有
  48.     //        //由于会进行类型的检查,这边是返回NULL
  49.     // const_pointer_cast  还有一个这个

  50.     return 0;
  51.     // 智能指针的转换,向上才是安全的,向下用dynamic_pointer_cast
  52. }
复制代码







让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

0

主题

98

帖子

200

积分

中级会员

Rank: 3Rank: 3

积分
200
沙发
发表于 2021-11-23 19:26:27 | 只看该作者
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|人工智能工程师的摇篮 ( 湘ICP备2020019608号-1 )

GMT+8, 2024-5-28 01:05 , Processed in 0.176268 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表