ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 运行时类型判断(RTTI) ### dynamic_cast * 用于多态类型的转换 ### typeid * typeid运算符允许在运行时确定对象的类型 * typeid返回type_info对象的引用 * 如果想通过基类的指针获得派生类的数据类型,基类必须带有虚函数 * 只能获取对象的实际类型 ```cpp #include <iostream> #include <typeinfo> /** * 基类,能飞的 */ 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 takeoff() {} virtual void land() {} }; void test(Flyable *obj) { obj->takeoff(); std::cout << typeid(*obj).name() << std::endl; std::cout << typeid(Bird).name() << std::endl; /** * Flyable基类必须有虚函数,否则以下判断对象类型将失效 */ if (typeid(*obj) == typeid(Bird)) { Bird *bird = dynamic_cast<Bird *>(obj); // 对象转化 bird->foraging(); } obj->land(); }; int main(int argc, char** argv) { Bird bird; test(&bird); return 0; } ```