文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-11-30 04:51

关注

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

有趣且不寻常的继承问题

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

import ;
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!"。这种方法更符合面向对象编程的思想,即将与对象相关的功能赋予这些对象。

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


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() 函数时生成的输出示例:

class Foo: Hello logger.

如你所见,由 typeid 运算符返回的名称是 “class Foo”。然而,这个名称依赖于你使用的编译器。例如,如果你使用 GCC 编译相同的代码,输出将如下所示:

3Foo: Hello logger.

注意:如果你使用 typeid 进行的目的不是日志记录和调试,请考虑使用虚方法重新实现它。

来源:coding日记内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯