当前位置:首页 > 科技  > 软件

C++ 运行时类型信息与继承技巧探索

来源: 责编: 时间:2023-11-21 17:12:50 153观看
导读运行时类型特性相比于其他面向对象语言,C++更倾向于编译时处理。如你之前所学,重写方法之所以有效,是因为方法与其实现之间存在一层间接关系,而不是因为对象内置了对其所属类的知识。然而,C++中确实有一些特性提供了对对象

运行时类型特性

相比于其他面向对象语言,C++更倾向于编译时处理。如你之前所学,重写方法之所以有效,是因为方法与其实现之间存在一层间接关系,而不是因为对象内置了对其所属类的知识。然而,C++中确实有一些特性提供了对对象的运行时视图。这些特性通常被归为一组功能,称为运行时类型信息(RTTI)。cmE28资讯网——每日最新资讯28at.com

RTTI提供了许多有用的特性,用于处理对象的类成员信息。其中一个特性是 dynamic_cast(),它允许你在面向对象的层次结构中安全地在类型之间转换;这在本章前面已经讨论过。在没有虚表(即没有虚方法)的类上使用 dynamic_cast() 会导致编译错误。cmE28资讯网——每日最新资讯28at.com

cmE28资讯网——每日最新资讯28at.com

有趣且不寻常的继承问题

RTTI的第二个特性是 typeid 运算符,它允许你在运行时查询对象的类型。大多数情况下,你不应该需要使用 typeid,因为基于对象类型有条件地运行的代码最好通过虚方法处理。以下代码使用 typeid 根据对象的类型打印消息:cmE28资讯网——每日最新资讯28at.com

import <typeinfo>;class Animal { public: virtual ~Animal() = default; };class Dog : public Animal {};class Bird : public Animal {};void speak(const Animal& animal) {    if (typeid(animal) == typeid(Dog)) {        cout << "Woof!" << endl;    } else if (typeid(animal) == typeid(Bird)) {        cout << "Chirp!" << endl;    }}

每当你看到这样的代码时,你应该立即考虑使用虚方法重新实现功能。在这种情况下,更好的实现方式是在 Animal 类中声明一个名为 speak() 的虚方法。Dog 类重写该方法以打印 "Woof!",而 Bird 类重写该方法以打印 "Chirp!"。这种方法更符合面向对象编程的思想,即将与对象相关的功能赋予这些对象。cmE28资讯网——每日最新资讯28at.com

警告:typeid 运算符只有在类至少有一个虚方法时才能正确工作,即当类有虚表时。此外,typeid 运算符会从其参数中去除引用和常量修饰符。typeid 运算符可能对于日志记录和调试目的有用。以下代码展示了如何使用 typeid 进行日志记录。logObject() 函数接受一个可记录的对象作为参数。这种设计使得任何可以被记录的对象都继承自 Loggable 类,并支持一个名为 getLogMessage() 的方法。cmE28资讯网——每日最新资讯28at.com


cmE28资讯网——每日最新资讯28at.com

cmE28资讯网——每日最新资讯28at.com

class Loggable { public: virtual ~Loggable() = default; virtual std::string getLogMessage() const = 0; };class Foo : public Loggable { public: std::string getLogMessage() const override { return "Hello logger."; } };

继承技巧的发现

class Loggable {public:    virtual ~Loggable() = default;    virtual std::string getLogMessage() const = 0;};class Foo : public Loggable {public:    std::string getLogMessage() const override {        return "Hello logger.";    }};void logObject(const Loggable& loggableObject) {    cout << typeid(loggableObject).name() << ": ";    cout << loggableObject.getLogMessage() << endl;}

logObject() 函数首先将对象类的名称写入输出流,然后是其日志消息。这样,当你稍后阅读日志时,你可以看到每条写入的行是由哪个对象负责的。以下是使用 Microsoft Visual C++ 2019 编译并调用 logObject() 函数时生成的输出示例:cmE28资讯网——每日最新资讯28at.com

class Foo: Hello logger.

如你所见,由 typeid 运算符返回的名称是 “class Foo”。然而,这个名称依赖于你使用的编译器。例如,如果你使用 GCC 编译相同的代码,输出将如下所示:cmE28资讯网——每日最新资讯28at.com

3Foo: Hello logger.

注意:如果你使用 typeid 进行的目的不是日志记录和调试,请考虑使用虚方法重新实现它。cmE28资讯网——每日最新资讯28at.com

cmE28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-32428-0.htmlC++ 运行时类型信息与继承技巧探索

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: FreeBSD 14 系统正式版发布:支持 1024 个 CPU 内核,下版本放弃 32 位硬件

下一篇: 低代码开发平台,是技术创新还是束缚?

标签:
  • 热门焦点
  • 影音体验是真的强 简单聊聊iQOO Pad

    影音体验是真的强 简单聊聊iQOO Pad

    大公司的好处就是产品线丰富,非常细分化的东西也能给你做出来,例如早先我们看到了新的vivo Pad2,之后我们又在iQOO Neo8 Pro的发布会上看到了iQOO的首款平板产品iQOO Pad。虽
  • 掘力计划第 20 期:Flutter 混合开发的混乱之治

    掘力计划第 20 期:Flutter 混合开发的混乱之治

    在掘力计划系列活动第20场,《Flutter 开发实战详解》作者,掘金优秀作者,Github GSY 系列目负责人恋猫的小郭分享了Flutter 混合开发的混乱之治。Flutter 基于自研的 Skia 引擎
  • Golang 中的 io 包详解:组合接口

    Golang 中的 io 包详解:组合接口

    io.ReadWriter// ReadWriter is the interface that groups the basic Read and Write methods.type ReadWriter interface { Reader Writer}是对Reader和Writer接口的组合,
  • JavaScript学习 -AES加密算法

    JavaScript学习 -AES加密算法

    引言在当今数字化时代,前端应用程序扮演着重要角色,用户的敏感数据经常在前端进行加密和解密操作。然而,这样的操作在网络传输和存储中可能会受到恶意攻击的威胁。为了确保数据
  • 使用Webdriver-manager解决浏览器与驱动不匹配所带来自动化无法执行的问题

    使用Webdriver-manager解决浏览器与驱动不匹配所带来自动化无法执行的问题

    1、前言在我们使用 Selenium 进行 UI 自动化测试时,常常会因为浏览器驱动与浏览器版本不匹配,而导致自动化测试无法执行,需要手动去下载对应的驱动版本,并替换原有的驱动,可能还
  • 一个注解实现接口幂等,这样才优雅!

    一个注解实现接口幂等,这样才优雅!

    场景码猿慢病云管理系统中其实高并发的场景不是很多,没有必要每个接口都去考虑并发高的场景,比如添加住院患者的这个接口,具体的业务代码就不贴了,业务伪代码如下:图片上述代码有
  • OPPO K11搭载长寿版100W超级闪充:26分钟充满100%

    OPPO K11搭载长寿版100W超级闪充:26分钟充满100%

    据此前官方宣布,OPPO将于7月25日也就是今天下午14:30举办新品发布会,届时全新的OPPO K11将正式与大家见面,将主打旗舰影像,和同档位竞品相比,其最大的卖
  • 最薄的14英寸游戏笔记本电脑  Alienware X14已可以购买

    最薄的14英寸游戏笔记本电脑 Alienware X14已可以购买

    2022年1月份在国际消费电子展(CES2022)上首次亮相的Alienware新品——Alienware X14现在已经可以购买了,这款笔记本电脑被誉为世界上最薄的 14 英寸游戏笔
  • “买真退假” 这种“羊毛”不能薅

    “买真退假” 这种“羊毛”不能薅

    □ 法治日报 记者 王春   □ 本报通讯员 胡佳丽  2020年初,还在上大学的小东加入了一个大学生兼职QQ群。群主&ldquo;七王&rdquo;在群里介绍一些刷单赚
Top