文章目录
- [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_cast
和 typeid
的使用上。
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
{
。。。
}
}