C++ 运行时类型识别(RTTI)
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 take off() {...}
virtual void land() {...}
}
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:
...
}
class doSomething(Flyable *obj) //【做些事情】
{
obj->takeoff();
cout << typeid(*obj).name() << endl; //输出传入对象类型(Bird or Plane)
if(typeid(*obj) == typeid(Bird)) //判断对象类型
{
Bird *bird = dynamic_cast<Bird *>(obj); //对象转化
bird->foraging();
}
obj->land();
}
- dynamic_cast 注意事项:
- 只能应用于指针和引用的转化
- 要转化的类型中必须包含虚函数
- 转化成功返回子类的地址,转化失败返回 NULL
- typeid 注意事项:
- type_id 返回一个 type_info 对象的引用
- 如果想通过基类的指针获得派生类的数据类型,基类必须带有虚函数
- 只能获取对象的实际类型
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

上一篇: C++ 多态
下一篇: 彻底找到 Tomcat 启动速度慢的元凶
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论