RTTI中dynamic_cast和typeid

本文详细介绍了C++中dynamic_cast操作符的应用注意事项及使用方法,并解释了其只能用于指针和引用转换的原因。此外,还探讨了typeid操作符的使用场景与限制条件。

dynamic_cast应用注意事项

  1. 只能应用与指针和引用的转换,而不能是类型本身
  2. 要转换的类型中必须包含虚函数
  3. 转换成功则返回子类的地址,失败返回NULL。

使用举例:

目标类 *p=dynamic_cast<目标类 *>(obj)

typeid注意事项

  1. type_id返回一个type_info对象的引用
  2. 如果想通过基类的指针获得派生类的数据类型,基类必须带有虚函数
  3. 只能获取对象的实际类型

使用举例:

typeid(*obj).name()

type_info类部分代码

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:
    ......
}
源码地址: https://pan.quark.cn/s/d1f41682e390 miyoubiAuto 米游社每日米游币自动化Python脚本(务必使用Python3) 8更新:更换cookie的获取地址 注意:禁止在B站、贴吧、或各大论坛大肆传播! 作者已退游,项目不维护了。 如果有能力的可以pr修复。 小引一波 推荐关注几个非常可爱有趣的女孩! 欢迎B站搜索: @嘉然今天吃什么 @向晚大魔王 @乃琳Queen @贝拉kira 第三方库 食用方法 下载源码 在Global.py中设置米游社Cookie 运行myb.py 本地第一次运行时会自动生产一个文件储存cookie,请勿删除 当前仅支持单个账号! 获取Cookie方法 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 按刷新页面,按下图复制 Cookie: How to get mys cookie 当触发时,可尝试按关闭,然后再次刷新页面,最后复制 Cookie。 也可以使用另一种方法: 复制代码 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 控制台粘贴代码并运行,获得类似的输出信息 部分即为所需复制的 Cookie,点击确定复制 部署方法--腾讯云函数版(推荐! ) 下载项目源码压缩包 进入项目文件夹打开命令行执行以下命令 xxxxxxx为通过上面方式或取得米游社cookie 一定要用双引号包裹!! 例如: png 复制返回内容(包括括号) 例如: QQ截图20210505031552.png 登录腾讯云函数官网 选择函数服务-新建-自定义创建 函数名称随意-地区随意-运行环境Python3....
非常好的问题!我们来一步一步讲解: --- ## ✅ 什么是 RTTIRTTI 的全称是 **Run-Time Type Information(运行时类型信息)**。 它是 C++ 提供的一种机制,**在程序运行时可以获取对象的实际类型信息**,比如: - 这个指针指向的对象到底是什么类型的? - 它有哪些父类? - 它的名字是什么? RTTI 主要包括两个组件: 1. `typeid` 运算符:可以获取一个对象或类型的运行时类型信息。 2. `dynamic_cast`:用于安全地进行向下转型(downcasting)或跨类转换(cross-casting)。 --- ## ✅ RTTI dynamic_cast 的关系 简单一句话: > **`dynamic_cast` 的实现依赖于 RTTI。** ### 举个例子: ```cpp #include <iostream> #include <typeinfo> // 需要这个头文件才能使用 typeid using namespace std; class Animal { public: virtual void speak() { cout << "Animal speaks" << endl; } virtual ~Animal() {} // 必须有虚析构函数才能启用 RTTI }; class Dog : public Animal { public: void bark() { cout << "Woof! Woof!" << endl; } }; int main() { Animal* animal = new Dog(); // 使用 typeid 查看运行时类型 cout << "Type of animal: " << typeid(*animal).name() << endl; // 使用 dynamic_cast 尝试向下转型 Dog* dog = dynamic_cast<Dog*>(animal); if (dog) { dog->bark(); // 成功调用 } delete animal; return 0; } ``` ### 输出可能为: ``` Type of animal: 3Dog Woof! Woof! ``` > `typeid(*animal).name()` 返回的是运行时的实际类型名(可能是编译器修饰后的名字,比如 `3Dog`)。 --- ## ✅ RTTI 是怎么工作的? RTTI 是通过 **虚函数表(vtable)** 实现的。 - 每个有虚函数的类都有一个虚函数表。 - 每个对象在运行时可以通过虚函数表找到自己的类型信息。 - `dynamic_cast` `typeid` 就是通过这个机制来判断对象的真实类型的。 --- ## ✅ 为什么没有虚函数就不能用 dynamic_cast? 因为: - 如果类没有虚函数,就不会有虚函数表。 - 没有虚函数表,就没有 RTTI 信息。 - 没有 RTTI 信息,就无法使用 `dynamic_cast` 或 `typeid`。 例如: ```cpp class Base {}; // 没有虚函数 class Derived : public Base {}; int main() { Base* base = new Derived(); Derived* d = dynamic_cast<Derived*>(base); // 编译错误! } ``` 你会看到类似这样的错误: ``` error: cannot dynamic_cast 'base' (of type 'class Base*') to type 'class Derived*' (source type is not polymorphic) ``` --- ## ✅ 总结一句话: > **RTTIC++ 在运行时识别对象类型的一种机制,而 dynamic_cast 正是基于 RTTI 来实现安全的类型转换。** --- ## ✅ 新手总结表: | 概念 | 是否依赖 RTTI | 说明 | |------|----------------|------| | `dynamic_cast` | ✅ 是 | 用于向下转型或跨类转换,安全 | | `typeid` | ✅ 是 | 获取运行时类型信息 | | `static_cast` | ❌ 否 | 不进行类型检查,不依赖 RTTI | | 没有虚函数的类 | ❌ 否 | 无法使用 RTTI dynamic_cast | --- ## ✅ 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值