C++ 运行时类型识别(RTTI)

发布于 2024-04-21 19:47:36 字数 1310 浏览 23 评论 0

class Flyable                       //【能飞的】
{
public:
    virtual void takeoff() = 0;    //起飞
    virtual void land() = 0;       //降落
}
class Bird : public Flyable         //【鸟】
{
public:
    void foraging() {...}           //觅食
    virtual void takeoff() {...}
    virtual void land() {...}
}
class Plane : public Flyable        //【飞机】
{
public:
    void carry() {...}              //运输
    virtual void take off() {...}
    virtual void land() {...}
}

class type_info
{
public:
    const char* name() const;
    bool operator == (const type_info & rhs) const;
    bool operator != (const type_info & rhs) const;
    int before(const type_info & rhs) const;
    virtual ~type_info();
private:
    ...
}

class doSomething(Flyable *obj)     //【做些事情】
{
    obj->takeoff();

    cout << typeid(*obj).name() << endl;    //输出传入对象类型(Bird or Plane)

    if(typeid(*obj) == typeid(Bird))    //判断对象类型
    {
        Bird *bird = dynamic_cast<Bird *>(obj); //对象转化
        bird->foraging();
    }

    obj->land();
}
  • dynamic_cast 注意事项:
  • 只能应用于指针和引用的转化
  • 要转化的类型中必须包含虚函数
  • 转化成功返回子类的地址,转化失败返回 NULL
  • typeid 注意事项:
  • type_id 返回一个 type_info 对象的引用
  • 如果想通过基类的指针获得派生类的数据类型,基类必须带有虚函数
  • 只能获取对象的实际类型

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

文章
评论
26 人气
更多

推荐作者

夢野间

文章 0 评论 0

百度③文鱼

文章 0 评论 0

小草泠泠

文章 0 评论 0

zhuwenyan

文章 0 评论 0

weirdo

文章 0 评论 0

坚持沉默

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文