阅读视图

发现新文章,点击刷新页面。

理解 C++ 中的 dynamic_cast: 安全的向下转型与向上转型


C++ 中的 dynamic_cast 是什么?

用途

  • 在运行时在多态类型之间安全地进行转换
  • 通常用于将基类指针转换为派生类指针(向下转型)
  • 使用 RTTI(运行时类型识别)进行类型检查

基本语法

Derived* d = dynamic_cast<Derived*>(basePtr);
  • 如果 basePtr 实际指向一个 Derived 对象,则转换成功
  • 否则,返回 nullptr

转换失败的情况

  1. 指针转换: 如果实际对象不是目标类型,则返回 nullptr
  2. 引用转换: 如果失败,会抛出 std::bad_cast 异常

指针向下转型示例

class Entity {
    virtual ~Entity() {}
};

class Player : public Entity {};
class Enemy : public Entity {};

Entity* e = new Enemy;
Player* p = dynamic_cast<Player*>(e);

if (p) {
    // 可以安全使用 p
} else {
    // p 是 nullptr
}

引用向下转型示例

try {
    Entity& e_ref = *new Enemy;
    Player& p_ref = dynamic_cast<Player&>(e_ref);
} catch (const std::bad_cast& ex) {
    // 捕获异常
}

派生类转基类(向上转型)

  • 总是安全的
  • 是隐式进行的,不需要转换语法
  • 不需要使用 dynamic_cast

向上转型示例

class Entity {
    virtual void say() {}
};

class Player : public Entity {
    void jump() {}
};

Player p;
Entity* e = &p;  // 隐式向上转型,安全
e-*gt;say();        // 正确
// e->jump();    // 错误:Entity 中没有 jump()

dynamic_cast 的使用条件

  • 基类必须是多态类(至少有一个 virtual 函数)
  • 只能用于指针或引用
  • 编译器需启用 RTTI(大多数默认启用)

static_castdynamic_cast 比较

特性 static_cast dynamic_cast
编译期检查
运行期安全
失败时可检测 ❌(行为未定义) ✅(返回 nullptr 或抛出异常)
需要虚函数

总结

  • 在处理多态类时,使用 dynamic_cast 进行类型安全的向下转型
  • 对于指针转换,请检查是否为 nullptr;引用转换请使用 try-catch 捕获异常
  • 派生类到基类的转换(向上转型)总是安全的,可隐式进行

C/C++编程

英文:Understanding dynamic_cast in C++: Safe Downcasting Explained

本文一共 372 个汉字, 你数一下对不对.
理解 C++ 中的 dynamic_cast: 安全的向下转型与向上转型. (AMP 移动加速版本)

扫描二维码,分享本文到微信朋友圈
75a5a60b9cac61e5c8c71a96e17f2d9c 理解 C++ 中的 dynamic_cast: 安全的向下转型与向上转型 C++ C++ 学习笔记 程序设计 计算机
The post 理解 C++ 中的 dynamic_cast: 安全的向下转型与向上转型 first appeared on 小赖子的英国生活和资讯.

相关文章:

  1. C++中的 const和constexpr 比较 C++ const 与 constexpr:真正的区别是什么? 一眼看都是定义常量。 为什么这很重要 现代 C++ 鼓励编写不可变、高效且表达力强的代码。两个关键字—const 和 constexpr—是这一理念的核心。它们看起来很相似,但理解它们的不同语义,对于正确利用编译期与运行期行为至关重要。 高层次对比 特性 const constexpr...
  2. 简易教程: C++的智能指针 C++ 智能指针教程 C++ 中的智能指针提供了自动且安全的内存管理。它们通过 RAII(资源获取即初始化)机制,帮助开发者避免内存泄漏和悬空指针的问题,确保对象在生命周期结束时被正确释放。 本教程将介绍 C++ 中三种主要的智能指针: std::unique_ptr:独占式所有权 std::shared_ptr:共享式所有权 std::weak_ptr:非拥有式弱引用 1. std::unique_ptr unique_ptr 拥有独占所有权。一个资源只能被一个...
  3. 被动收入之: 微博红包 今年开始重新经营我的微博帐号 drlai 收到两笔微信红包,应该是来自于官方的支持,150元(成功提现到支付宝)。虽然这不能持久,也没多少,但毕竟实现了零的突破,意义重大。 如果流量上来,内容创作者可能会接受到比较多的赞赏,这也是一个比较简单的变现方法。这也能作为一种被动收入,不过如果不是头部网红,可能杯水车薪,但如果你有好几个类似这样的,也能积少成多! 在用户中心,微博用户可以每天登陆手机微博APP打卡,获取点数和少量的红包钱(几分钱),积少成多! 微博做些小任务可获得积分和几分钱。聊胜于无。 微博的主要盈利模式 微博的主要盈利模式主要包括以下几个方面: 广告收入:微博的大部分收入来源于广告,尤其是品牌广告和效果广告。广告形式包括信息流广告(类似于推文广告)、热门话题广告、开屏广告和视频广告。品牌和企业可以利用微博庞大的用户群和社交互动来提升曝光率、推广品牌和产品。 会员服务:微博提供的VIP会员服务,用户可以支付订阅费用来享受更多的特权,比如个性化的主题、特有的表情包、私密权限设置等。这些会员服务主要面向个人用户,提升其社交体验。 直播和打赏:微博提供直播平台,用户可以通过购买虚拟礼物来支持主播,微博会从这些打赏中抽取一定比例的分成。此外,微博与内容创作者分成,通过内容付费、知识付费等形式变现。 增值服务:针对企业和大V(拥有大量粉丝的用户),微博还提供增值服务,如账号认证、粉丝数据分析、精准推送、推广和营销工具等。这些服务帮助企业提升营销效果,同时也增加了微博的收入来源。 电商和导流:微博上有大量的电商导流业务,尤其是和明星、网红的合作推广。微博用户在浏览社交内容时,可以直接跳转到商品购买链接,微博通过这种方式赚取导流佣金。 游戏联运:微博也会与一些游戏公司合作推出联合运营的游戏,微博负责推广和流量引入,用户充值或付费时,微博可以获得一部分的分成。 这些模式相结合,使得微博能够在广告市场、内容创作和电商等多个领域获利。...
  4. 借助AI快速开源了三个小工具: 写代码越来越像做产品了, AI 真把我宠坏了(Vibe Coding) 程序员的未来?Vibe Coding + AI 一起上! 借助 AI 快速开源了三个小工具 最近,我利用 ChatGPT-4o 和 o4-mini 快速开发并开源了三个小工具。起因其实很简单——每次想转换 YAML/JSON 或进行...
  5. 你给SteemIt中文微信群拖后腿了么? 这年头不缺算法, 就缺数据. 这两天花了很多时间在整API上, 整完之后自己用了一下还觉得真是挺方便的. 今天就突然想看一看自己是否给大家拖后腿了, 于是调用每日中文区微信群排行榜单的API, 刷刷拿着 NodeJs 练手: 1 2 3 4 5 6...
  6. 按揭贷款(房贷,车贷) 每月还贷计算器 去年给银行借了17万英镑 买了20万7500英镑的房子, 25年还清. 前2年是定率 Fix Rate 的合同 (年利率2.49%). 每个月大概是还 700多英镑. 有很多种还贷的计算方式, 定率/每月固定 是比较常用的. 简单来说就是 每个月交的钱是...
  7. 换了个奥迪Q5大灯花了我1000英镑 我那辆奥迪Q5 SUV今年年检没通过,原因是左前车灯坏了,需要更换。车厂告诉我,光是订购零件就要700多英镑,加上人工费,总费用得1000英镑。但没办法,如果不修,车辆年检(MOT)就过不了,车也不能上路。 MOT是英国的机动车强制性安全检测(Ministry of Transport Test)的简称。 近侧前位置灯不工作 drl/位置灯集成(4.2.1(a)(ii)) Nearside Front Position lamp not working drl/position...
  8. Javascript 中 sleep 函数实现 Javascript 中并没有 built-in 的 sleep 函数支持, 在 async/await/Promise 的支持之前, 我们可以用 busy-waiting 的方式来模拟: 1 2 3...

在抖音上抢广电有线A套餐

当年今日

理论上广电的有线专属卡A档套餐是有前置条件的,但现在不知道为什么,突然就没有了前置条件,直接放在了抖音上面卖。我也搞不懂为什么广电要把套餐放在抖音上面卖,为什么就不能放在淘宝、京东、拼多多之类?大概是因为他们要制造饥饿营销。因为直播这种东西,被抢的那些货物转瞬即逝,所以根本不由得用户有半分的犹豫,就是因为这种知道不抢就没有,所以非常有可能抢到的东西实际上并不是我们想要的。主播当然会做各种各样的介绍,但那都只是主观选择性地介绍某一些细节性的东西,不会说或者故意不说明白另外那些不利的,于是这就导致了直播说的跟线下营业厅的不一致。

因为在百度贴吧上看到有人说如果不在抖音上先抢名额直接去营业厅,人家不让你办。所以既然我计划好了要办这个套餐,所以我也就只能先下载一个抖音,然后开一个账号,我就是为了这个有线A而开抖音账号,之前我的手机上没有抖音、快手、小红书。注册的时候我就有点意外,抖音居然不可以用微信关联注册,注册进去以后发现理论上可以第三方登录,那里可以选QQ或微信,但实际上依然是不可以用微信关联登录,所以抖音跟微信,到底有什么深仇大恨呢?支付的时候可以用银行卡,也可以用支付宝,但是那里同样没有微信。

几乎可以这么说,我是一个阿里系的人,对阿里相关的各种东西整个操作我都比较熟悉。不仅仅是操作,熟悉他们的界面,他们的东西放哪里,通常我都能找得到,因为用得多。所以使用抖音的时候,我觉得各种不顺手,我简直不知道要去哪里找东西了。设置这个简单的功能在不同地方居然用不同的入口,虽然进去以后东西是一样的。直播在哪里找?直播账号在哪里找?团购在哪里找?这些东西我都得摸索。

注册抖音的第一个晚上我发现广州广电官方的账号的商城里有13个商品,但没有78块钱的有线A套餐。直播的时候我打开直播间的链接,有78块钱的,但是处在一个已抢完的状态,但实际上我第一次进去,虽然显示的是已抢完,但是我依然可以弹出付款界面,我不知道这是不是新用户的特异功能。因为我也就只有在刚注册进去的时候才进入过已抢光商品的购买页面,后来大概十几分钟以后,我也进不去了。直播间主推的是228的有线C套餐。虽然他们没有明讲那是有线C,但实际上那就是有线C,我不知道为什么不直接说出来。主播在那里循环推荐组有线C,于是你看到有线C套餐有时是已抢光,有时又上架了,处在一个不断循环有货无货的状态,但有线A那天晚上我没有见过有货。从百度贴吧的评论看来,理论上这个有线A套餐应该在官方账号的商城里很容易就能买到,但实际上商城里没有,只能在直播间里抢,虽然直播间是日夜都播的。上午8点开播、晚上19点开播。上午8点出头的时候我进去过,有线A套餐处在第1个链接,但是已经是已抢光的状态,所以周五晚上我蹲在那里,等待19点开播,一进去以后我马上点根本没有半丝犹豫。

支付的时候,其实也慢了一点点,但是处在一个待支付的状态,实际上已经锁定名额了,我记得第一天注册抖音的时候,给我的优惠是15块钱,然后是20块钱,到我最终支付的时候,只要我绑定银行卡,就给了我30块钱的优惠,所以我用48块钱就买了78块钱一年的有线A套餐。这属于狗屎运,但这又不完全是运气,因为这有技巧的成分。我知道他们会上架78块钱的有线A套餐,但从直播的情况看来,他们只会在一开播的时候放出一定的名额,所以我也就只能蹲在一开播的时候就进去干。其实我也不确定是不是这样,但是这一次,我摸对了他们的规则。至于抖音的优惠,作为新用户,他们肯定要表示一下,但是这种过上一段时间就加大优惠力度的做法,我以前没有遇到过。抖音在使用过程之中会有各种的坑,比如说有月付的陷阱。陷阱随便就进去了,如果你没看清就会中招了,即便你看清了,也不容易退出。我个人感觉远离抖音就能避免很多不理性消费。

首先是决定了要买有线A,然后注册抖音,接着是费尽心思抢名额。决心不够的人,没办法做成这些。

回归纯血 Ubuntu

书接上回。

本地电脑升级到基于 Ubuntu 24.04 的 elementary OS 8.0 后,php-fpm 8.3 一直无法使用,不管是 AI 还是 bing 搜索一直无法解决。

后来测试了 apache2 使用 php-cli 没问题,使用 php-fpm 和 nginx 一样也是 access deny。

实在无解,退而求其次,就用虚拟机测试了原版 Ubuntu,居然没有一点问题。

所以基本可以肯定是 elementary OS 8.0 的问题了。

下载 Ubuntu 烧录 USB 盘,安装系统,apt install php8.3 php8.3-fpm 一路绿灯顺利搞定。

纯血 ubuntu
纯血 ubuntu

纯血 Ubuntu 这大红大紫的色调看着还有点不习惯,5.9G 的 iso 镜像文件,安装完连播放器都不带的,然后就是原来右上角的菜单栏居然改成了用于切换桌面工作台的,这修改有点出乎意料,这是怕用户用鼠标切换桌面太快了,放这么个角落,那我还不如 alt+tab 呢。

Ubuntu 自带的运用中心,snap 源安装的运用有的会因为缺乏依赖打不开,还是得通过 snap install 命令安装才能自动带上依赖,浪费了我一些时间。

最头疼的是 github,有时候莫名其妙就突然不能访问,设置 git 搞了我许多时间。

总体来说,纯血 Ubuntu 24.04 比我原来用的 Elementary OS 8.0 更省资源,电池都感觉用的久了,也不知道是不是因为装的东西少的原因。

Sci-Fi Movies That Aren't Sci-Fi Anymore

I love science fiction movies for lots of reasons, but the biggest draw is, of course, that sci-fi speculates about how science and technology will change the world. Sometimes it's a prediction of how technology that will certainly exist could change things. Other times, technology itself is a product of pure imagination.

6 YouTube Hacks Every Beginner Should Know

YouTube is my favorite place to spend free time, whether learning new skills or watching videos I enjoy. But most of us miss out on features that can make YouTube even better to use. If you're new to YouTube or looking to use the platform efficiently, here are some tips you must know.

回归纯血 Ubuntu

书接上回。

本地电脑升级到基于 Ubuntu 24.04 的 elementary OS 8.0 后,php-fpm 8.3 一直无法使用,不管是 AI 还是 bing 搜索一直无法解决。

后来测试了 apache2 使用 php-cli 没问题,使用 php-fpm 和 nginx 一样也是 access deny。

实在无解,退而求其次,就用虚拟机测试了原版 Ubuntu,居然没有一点问题。

所以基本可以肯定是 elementary OS 8.0 的问题了。

下载 Ubuntu 烧录 USB 盘,安装系统,apt install php8.3 php8.3-fpm 一路绿灯顺利搞定。

纯血 ubuntu
纯血 ubuntu

纯血 Ubuntu 这大红大紫的色调看着还有点不习惯,5.9G 的 iso 镜像文件,安装完连播放器都不带的,然后就是原来右上角的菜单栏居然改成了用于切换桌面工作台的,这修改有点出乎意料,这是怕用户用鼠标切换桌面太快了,放这么个角落,那我还不如 alt+tab 呢。

Ubuntu 自带的运用中心,snap 源安装的运用有的会因为缺乏依赖打不开,还是得通过 snap install 命令安装才能自动带上依赖,浪费了我一些时间。

最头疼的是 github,有时候莫名其妙就突然不能访问,设置 git 搞了我许多时间。

总体来说,纯血 Ubuntu 24.04 比我原来用的 Elementary OS 8.0 更省资源,电池都感觉用的久了,也不知道是不是因为装的东西少的原因。

我和广州广电

当年今日

周六我去营业厅办理的是广电有线专属卡A档套餐。理论上这个有线专属卡套餐的前置条件是你已经办理了宽带或者有线电视的业务,那么你就可以加办这个套餐。理论上没有上述那两种业务的人是没办法单独办这个套餐的。一开始在我听说有这个套餐的时候,我已经具备了这个条件,因为我家用的就是珠江数码,珠江数码属于广州有线电视。在广州,有线电视也分两款,一个是广州有线电视,一个是广东有线电视。我家住在海珠区,也就是俗称的河南。直到几年前我才知道广州有线电视跟广东有线电视的区别。只有广州有线电视,也就是珠江数码才能看得到香港电视台。我家使用有线电视的时候,我根本不知道这个,我以为人人家只要装了有线电视都能看香港台。后来发现原来这不仅仅是在广州,在全国范围之内,也就只有广州有线电视有这个功能。当然了,上了大学以后我才知道我深圳的同学家根本不需要装有线电视,他们只要有个足够好的天线,就能接收到香港台的信号,所以他们是免费看香港台的。我家大概是从1992年开始装有线电视,无论是我家还是外婆家,还是其他比较亲近的那些亲戚家里,基本上都是那个时间段装有线电视。那个时候,无论是去哪个亲戚家,我感觉好像大家都能看香港台,于是这也就解释了为什么之前我说我一直不知道原来广州有线电视是这么特殊的。

因为我家一直都在用广州有线电视,所以这个有线专属卡我肯定可以办理,唯一让我犹豫的只是家里的那个账户是我妈的,缴费是跟存折绑定的。如果我的套餐跟那条有线电视有什么关联,那么会不会某一次升级了以后,我手机卡没了也就算了,家里那条有线电视也硬是要我升级,那就很麻烦。第一次听说有这个套餐的时候,中国移动的零星流量没有现在这么窘迫。

我可以办,但我没办,最主要的原因是我不想把家里有线电视的那个账号供出去,其次就是当时广电的营业厅在广州真的很少。江南西肯定是有一个营业厅,一直以来那里都有珠江数码的营业厅,不过现在的那个位置跟之前的那个位置有一点点区别,移动了几个铺位,虽然也都在50米的范围内。至于海珠区到底哪里还有珠江数码的营业厅,简直就是个未解之谜。接着我又发现原来海珠区也有广东有线电视的营业厅。既然有线电视分广州和广东,那么这个广电手机卡我估计在两个营业厅办也是不相通的。为什么一直以来都这样呢?我实在搞不懂。就连广电的网站,广东和广州都是不一样的,他们的logo也不一样的。通常情况下我们家会在晚上晚18点00-19点00的看广视新闻,也就是广州电视台的新闻。新闻间歇可能插播广电的广告,他们播的那个是广州广电的广告,因为那里提到了珠江数码。在最终决定使用电信的宽带套餐之前,我们也有考虑过用珠江数码,但因为那个时候他们的师傅的服务态度实在太差了,所以后来我们选择了中国电信。

生在长在广州的我,其实很久以前已经跟广州广电结缘了,只不过以前我们家一直都在用他们的有线电视服务,现在用上了他们新的电话卡业务而已。

Why Overclocking Isn't Useful Anymore

Overclocking used to be all the rage among gamers and other PC enthusiasts, but new technologies have made it irrelevant for most people in most situations. And the best part? To get the same perks, you don't have to do much of anything at all.

16 Vintage Tech Symbols That Live On in the Digital Age

Technology and how we use it has changed a lot over the years. However, despite the rapid advancements, traces of older tech still linger in our modern devices in the form of icons. Whether it's your smartphone, video game console, laptop, or desktop PC, or even your smart TV, the digital world is filled with visual callbacks to the past.

❌