运行类型识别

一、使用RTTI

dynamic_cast运算符的调用形式如下所示:

dynamic_cast<type*>(e)   //e是指针
dynamic_cast<type&>(e) //e是左值
dynamic_cast<type&&>(e) //e是右值

e能成功转换为type*类型的情况有三种:

1)e的类型是目标type的公有派生类:派生类向基类转换一定会成功。

2)e的类型是目标type的基类,当e是指针指向派生类对象,或者基类引用引用派生类对象时,类型转换才会成功,当e指向基类对象,试图转换为派生类对象时,转换失败。

3)e的类型就是type的类型时,一定会转换成功。

1. 测试代码:

 class Rect : public Shape {
public:
void fun() {};
void prin() { cout << "我是方形" << endl; }
}; class Circle : public Shape {
public:
void fun() {};
void prin() { cout << "我是圆形" << endl; }
}; void fun(Shape *p)
{
if (typeid(*p) == typeid(Rect))
{
Rect *r = dynamic_cast<Rect *>(p);
r->prin();
}
if (typeid(*p) == typeid(Circle))
{
Circle *c = dynamic_cast<Circle *>(p);
c->prin();
}
}
int main()
{
Rect r;
cout << "第一次执行fun函数:";
fun(&r); Circle c;
cout << "第二次执行fun函数:";
fun(&c); return ;
}

输出结果:

二、type_info类

1. 测试代码:

 #include <iostream>
#include <typeinfo.h>
using namespace std; class Base {
public:
virtual void vvfunc() {}
}; class Derived : public Base {}; int main()
{
Derived* pd = new Derived;
Base* pb = pd;
cout << typeid(pb).name() << endl; //prints "class Base *"
cout << typeid(*pb).name() << endl; //prints "class Derived"
cout << typeid(pd).name() << endl; //prints "class Derived *"
cout << typeid(*pd).name() << endl; //prints "class Derived"
delete pd;
}

输出结果:

2. 代码示例

 #include <iostream>
#include <typeinfo> int main()
{
if (typeid(int).before(typeid(char)))
std::cout << "int goes before char in this implementation.\n";
else
std::cout << "char goes before int in this implementation.\n";
}

运行结果:

3. 代码示例

 #include <iostream>
#include <typeinfo>
#include <string>
#include <utility> class person
{
public: person(std::string&& n) : _name(n) {}
virtual const std::string& name() const { return _name; } private: std::string _name;
}; class employee : public person
{
public: employee(std::string&& n, std::string&& p) :
person(std::move(n)), _profession(std::move(p)) {} const std::string& profession() const { return _profession; } private:
std::string _profession;
}; void somefunc(const person& p)
{
if (typeid(employee) == typeid(p))
{
std::cout << typeid(p).name() << std::endl;
std::cout << p.name() << " is an employee ";
auto& emp = dynamic_cast<const employee&>(p);
std::cout << "who works in " << emp.profession() << '\n';
}
} int main()
{
employee paul("Paul", "Economics");
somefunc(paul);
}

运行结果:

参考资料

【C++ Primer | 19】运行类型识别的更多相关文章

  1. C 语言Struct 实现运行类型识别 RTTI

    通过RTTI,能够通过基类的指针或引用来检索其所指对象的实际类型.c++通过下面两个操作符提供RTTI. (1)typeid:返回指针或引用所指对象的实际类型.    (2)dynamic_cast: ...

  2. MFC原理第三讲.RTTI运行时类型识别

    MFC原理第三讲.RTTI运行时类型识别 一丶什么是RTTI RTTI. 运行时的时候类型的识别. 运行时类型信息程序.能够使用基类(父类)指针 或者引用 来检查这些指针或者引用所指的对象. 实际派生 ...

  3. C++学习之显式类型转换与运行时类型识别RTTI

    static_cast const_cast reinterpret_cast 运行时类型识别(RTTI) dynamic_cast 哪种情况下dynamic_cast和static_cast使用的情 ...

  4. C++之运行时类型识别RTTI

     C++ Code  12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 ...

  5. RTTI 运行时类型识别 及异常处理

    RTTI   运行时类型识别 typeid  ------  dynamic_cast dynamic_cast 注意事项: 1.只能应用于指针和引用之间的转化 2.要转换的类型中必须包含虚函数 3. ...

  6. RTTI (Run-Time Type Identification,通过运行时类型识别) 转

    参考一: RTTI(Run-Time Type Identification,通过运行时类型识别)程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型.   RTTI提供了以下两个 ...

  7. MFC六大核心机制之二:运行时类型识别(RTTI)

    上一节讲的是MFC六大核心机制之一:MFC程序的初始化,本节继续讲解MFC六大核心机制之二:运行时类型识别(RTTI). typeid运算子 运行时类型识别(RTTI)即是程序执行过程中知道某个对象属 ...

  8. c++运行时类型识别(rtti)

    一个简单运行时类型识别 namespace rtti_ex { /* * 类型信息基类 */ class i_type_info { public: // 判断是否是指定类型 bool is(cons ...

  9. Java基础之RTTI 运行时类型识别

    运行时类型识别(RTTI, Run-Time Type Identification)是Java中非常有用的机制,在Java运行时,RTTI维护类的相关信息. 多态(polymorphism)是基于R ...

随机推荐

  1. java日期相关

    JAVA中获得一个月最大天数的方法 参考博客:http://www.cnblogs.com/relucent/p/4566582.html Calendar 类是一个抽象类,为日历字段之间的转换提供了 ...

  2. js鼠标移入移出效果【原】

    <HTML> <HEAD> <!-- meta 解释 : http://www.haorooms.com/post/html_meta_ds --> <met ...

  3. LaTeX简历模板

    %# -*- coding:utf-8 -*- %% start of file `template_en.tex'. %% Copyright 2006-1008 Xavier Danaux (xd ...

  4. JAVA实现二叉树(简易版--实现了二叉树的各种遍历)

    1,个人感觉二叉树的实现主要还是如何构造一颗二叉树.构造二叉树函数的设计方法多种多样,本例采用 addNode 方法实现.以下程序通过定义内部类来表示二叉树的结点,然后再实现了二叉树这种数据结构的一些 ...

  5. Easyui comboxgrid弹出窗增加搜索功能

    效果如上图所示 <input id="q_item" name="q_item" style="width:200px" toolba ...

  6. nmap扫描出现tcpwrapped

    FAQ tcpwrapped From SecWiki Jump to: navigation, search What does "tcpwrapped" mean? tcpwr ...

  7. MySQL指令

    在mysql里:文件夹就是数据库      文件就是表 创建用户: 格式:create user '用户名'@'IP地址' identified by '密码'; 说明:IP地址是用来限制用户只能在哪 ...

  8. 字体QFont

    import sys from PyQt5.QtWidgets import QApplication, QWidget,QLabel from PyQt5.QtGui import QFont fr ...

  9. JavaScript之关闭轮询定时器(setTimeout/clearTimeout|setInterval/clearInterval)小结

    已知: 1.1 开启Timeout程序: scope.setTimeout("functionName()" | functionHandle, timeValue) 返回值:ti ...

  10. POJ1287 Networking【最小生成树】

    题意: 给出n个节点,再有m条边,这m条边代表从a节点到b节点电缆的长度,现在要你将所有节点都连起来,并且使长度最小 思路: 这是个标准的最小生成树的问题,用prim的时候需要注意的是他有重边,取边最 ...