RTTI(运行时类型识别)
1 目标
本文的目的是学习RTTI(运行时类型识别)。
2 示例代码
RTTI(运行时类型识别)在 C++ 中用于在运行时识别对象的类型。RTTI 提供了两个主要的操作符:dynamic_cast 和 typeid。
2.1 使用 dynamic_cast 进行类型转换
#include <iostream>
#include <typeinfo>
class Base {
public:
virtual ~Base() = default; // 虚析构函数,使 Base 成为多态类
};
class Derived1 : public Base {
public:
void show() {
std::cout << "这是 Derived1 类" << std::endl;
}
};
class Derived2 : public Base {
public:
void display() {
std::cout << "这是 Derived2 类" << std::endl;
}
};
void checkType(Base* base) {
if (Derived1* d1 = dynamic_cast<Derived1*>(base)) {
d1->show();
} else if (Derived2* d2 = dynamic_cast<Derived2*>(base)) {
d2->display();
} else {
std::cout << "无法识别的类型" << std::endl;
}
}
int main() {
Base* b1 = new Derived1();
Base* b2 = new Derived2();
Base* b3 = new Base();
checkType(b1); // 输出:这是 Derived1 类
checkType(b2); // 输出:这是 Derived2 类
checkType(b3); // 输出:无法识别的类型
delete b1;
delete b2;
delete b3;
return 0;
}
2.2 使用 typeid 进行类型识别
#include <iostream>
#include <typeinfo>
class Base {
public:
virtual ~Base() = default; // 虚析构函数,使 Base 成为多态类
};
class Derived1 : public Base {};
class Derived2 : public Base {};
void printTypeInfo(Base* base) {
std::cout << "对象的实际类型是: " << typeid(*base).name() << std::endl;
}
int main() {
Base* b1 = new Derived1();
Base* b2 = new Derived2();
Base* b3 = new Base();
printTypeInfo(b1); // 输出:对象的实际类型是: 7Derived1(具体输出取决于编译器)
printTypeInfo(b2); // 输出:对象的实际类型是: 7Derived2(具体输出取决于编译器)
printTypeInfo(b3); // 输出:对象的实际类型是: 4Base(具体输出取决于编译器)
delete b1;
delete b2;
delete b3;
return 0;
}
3 总结
RTTI 使得在运行时处理多态类层次结构中的对象类型变得更加灵活和安全。
- dynamic_cast:用于安全地向下转换指针或引用,确保类型转换是有效的。
- typeid:用于获取对象的实际类型信息,可以用于调试和日志记录。