UEC++中的RTTI

文章目录

  • [1 C++中的RTTI](#1 C++中的RTTI)
    • [1.1 dynamic_cast](#1.1 dynamic_cast)
    • [1.2 typeid](#1.2 typeid)
  • [2 UE C++中的RTTI](#2 UE C++中的RTTI)
    • [2.1 Cast](#2.1 Cast)
    • [2.2 IsA](#2.2 IsA)

1 C++中的RTTI

RTTI (Runtime Type Information,运行时类型信息)是C++语言提供的一种机制,允许在程序运行时获取对象的类型信息,RTTI通常用于处理多态性、类型转换和类型检查。

在C++中通常体现在:dynamic_casttypeid的使用上。

1.1 dynamic_cast

dynamic_cast 是一种用于在继承体系中进行类型安全的指针或引用转换的操作符。它在运行时检查转换是否有效。如果转换成功,返回指向目标类型的指针或引用;如果失败,返回 nullptr(对于指针转换)或抛出 std::bad_cast 异常(对于引用转换)。

示例

cpp 复制代码
class Base
{
    virtual void Cry() {}
};

class son: public Base 
{
    void Cry() override {}
};

int main()
{
	// 基类指针指向子类对象
	Base* base = new Son();
	// 运行时进行指针类型转换,只有base指向的真的是Son类型的对象才会转换成功
	Son* son = dynamic_cast<Son*>(base);
	if (son) 
	{
		// 成功
	    son->Cry();
	} 
	else 
	{
	    // 失败
	}
}

1.2 typeid

typeid 操作符用于在运行时获取对象的类型信息。它返回一个 std::type_info 对象,包含有关类型的信息。

cpp 复制代码
#include <iostream>
#include <typeinfo>

class Base {
    virtual void Cry() {}
};

class Son: public Base 
{
    void Cry() override {}
};

Base* base = new Son();
// 检查base指向的对象是否为Son类型
if (typeid(*base) == typeid(Son)) 
{
    // base确实指向了一个Son对象
}

2 UE C++中的RTTI

UE中,RTTI被封装并拓展,更加易用。主要应用为:

  • Cast 函数:用于安全地进行类型转换。
  • IsA 方法:用于检查对象是否属于某个特定类型。

2.1 Cast

Cast 函数是UE中的一种类型安全的强制转换方式,与 dynamic_cast 类似,但经过了优化,更适用于UE的环境。

cpp 复制代码
void SetMaterial(UMaterialInterface* Material)
{
    if (UMaterial* BaseMaterial = Cast<UMaterial>(Material))
    {
        UE_LOG(LogTemp, Log, TEXT("传入的材质是母材质"));
    }
    else if (UMaterialInstance* MaterialInstance = Cast<UMaterialInstance>(Material))
    {
        UE_LOG(LogTemp, Log, TEXT("传入了材质实例"));
    }
    else
    {
        UE_LOG(LogTemp, Warning, TEXT("其他类型材质"));
    }
}

2.2 IsA

IsA 方法可以检查对象是否是某个特定类的实例

cpp 复制代码
void SetMaterial(UMaterialInterface* Material)
{
    if (Material->IsA<UMaterial>())
    {
        。。。
    }
    else if (Material->IsA<UMaterialInstance>())
    {
        。。。
    }
    else
    {
        。。。
    }
}
相关推荐
luj_176810 小时前
残熵算法实时化三大瓶颈突破
c语言·开发语言·网络·经验分享·算法
不听话坏10 小时前
Ignition篇(下 一) 动态执行前的事情
开发语言·前端·javascript
likeyi0710 小时前
require 和 import的区别
开发语言·前端
远离UE411 小时前
UE5 compute shader 原子加
开发语言·c++·ue5
C+-C资深大佬11 小时前
C++ 显式类型转换详解:static_cast、dynamic_cast、const_cast、reinterpret_cast
开发语言·c++
朗迹 - 张伟11 小时前
UE5.7 PCG从入门到精通系列课程【第一课:基础介绍】
ue5·pcg
KaMeidebaby12 小时前
卡梅德生物技术快报|抗体亲和力成熟工业化调控新机制:差异性浆细胞增殖工艺优化思路
java·开发语言·人工智能·算法·机器学习·架构·spark
luj_176812 小时前
心形曲线轨迹控制三大关键技术
c语言·开发语言·c++·经验分享·算法
取地址符12 小时前
C++学习笔记(基于learn-cxx)(1)
c++·经验分享·笔记·学习
Mininglamp_271813 小时前
Claude Code 封禁中国开发者之后:本地 AI 编程工具的替代方案实测
开发语言·人工智能·windows·开源软件·ai-native