C++中的类型判断,其余java中的 instanceof 做比较

这是RTTI(运行阶段类型识别)的问题,c++有三个支持RTTI的元素:
1. dynamic_cast 操作符
    如果可能的话,dynamic_cast操作符将使用一个指向基类的指针来生成一个指向派生类的指针;否则,该操作符返回空指针。这是最常用的
RTTI组件,它不能回答“指针指向的是哪类对象”这样的问题,但他能回答“是否可以安全地将对象的地址赋给特定类型的指针”这样的问题。如:
class A{}
class B: public A{}
class C: public B{}
然后有下面的指针:
A *a = new A;
B *b = new B;
C *c = new C;
则:
C *cc1 = dynamic_cast<C*>(c);    //安全
C *cc2 = dynamic_cast<C*>(a);    //cc2是空指针
C *cc3 = dynamic_cast<c*>(b);    //cc3是空指针
B *bb = dynamic_cast<C*>(b);     //安全
注:只能将此RTTI用于包含虚函数的类层次结构,原因在于只有对于这种类层次结构,才应该将派生类对象的地址赋给基类指针。

2. typeid操作符
3. type_info结构,(须包含头文件<typeinfo>)
class A{}
class B: public A{}
class C: public B{}
然后有下面的指针:
A *pa = new A;
B *pb = new B;
C *pc = new C;
则:
typeid(C) == typeid(pc);  //值为true
typeid(B) == typeid(pc);  //值为false

type_info有一个name()成员函数,返回一个类名的字符串:
cout << typeid(*pc).name();  //打印C类的类名

注:typeid操作符和name()成员函数都适用于dynamic_cast和virtual函数不能处理的情况

时间: 2024-08-06 15:33:12

C++中的类型判断,其余java中的 instanceof 做比较的相关文章

jQuery中的类型判断

在JQuery中有一个type方法,在1.11.2中是这样写的 1 var class2type = {}; 2 var toString = class2type.toString; 3 jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { 4 class2type[ "[object &quo

c#中的里氏转换和Java中强制类型转换在多态中的应用

在c#中: 注意: 子类并没有继承父类的构造函数,而是会默认调用父类那个无参数的构造函数. 如果一个子类继承了一个父类,那么这个子类除了可以使用自己的成员外,还可以使用从父类那里继承过来的成员.但是父类永远都只能使用自己的成员,而不能使用子类的成员. 子类之间也不能互相使用对方的成员. 里氏转换的概念: 1).子类可以赋值给父类 2).如果父类中装的是子类对象,那么可以讲这个父类强转为子类对象. namespace 里氏转换_接口练习 { class Program { static void

数据库中字段类型对应的C#中的数据类型

数据库中字段类型对应C#中的数据类型: 数据库                 C#程序 int int32 text string bigint int64 binary System.Byte[] bit Boolean char string datetime System.DateTime decimal System.Decimal float System.Double image System.Byte[] money   System.Decimal nchar String n

c#中泛型集合directory和java中map集合对比

c#中directory的基本用法1.创建及初始化 Dictionary<int, string> myDictionary = new Dictionary<int, string>(); 2.添加元素 myDictionary.Add("C#",0); myDictionary.Add("C++",1); myDictionary.Add("C",2); myDictionary.Add("VB",

数据库中字段类型对应的C#中的数据类型(转载)

数据库中字段类型对应C#中的数据类型: 数据库                 C#程序 int int32 text string bigint int64 binary System.Byte[] bit Boolean char string datetime System.DateTime decimal System.Decimal float System.Double image System.Byte[] money   System.Decimal nchar String n

js中浏览器类型判断

在JS中判断浏览器的类型,估计是每个编辑过页面的开发人员都遇到过的问题.在众多的浏览器产品中,IE.Firefox.Opera.Safari........众多品牌却标准不一,因此时常需要根据不同的浏览器,甚至相同浏览器不同版本做不同的操作,因此,知晓浏览器的判断方法,还是很重要的.下面列举一下常用的判断方法:1.判断浏览器是否为IE        document.all ? 'IE' : 'others':在IE下document.all值为1,而其他浏览器下的值为0:        nav

gRPC中Any类型的使用(Java和NodeJs端)

工作中要把原来Java服务端基于SpringMVC的服务改为使用gRPC直接调用.由于原Service的返回值为动态的Map类型,key值不确定,且value的类型不唯一,因此使用了protobuf 3中的map和Any类型.在这个过程中遇到了一些困难,查阅资料时发现这一块的资料不是很多,尤其是在NodeJS的gRPC-Client处理google.protobuf.Any类型,完全找不到相关的资料.好在自己摸索和调试后解决了问题,因此记录下来以供他人之需. testservice.proto:

mybatis中 bit类型判断

<if test="recommend != null and recommend == true"> and g.recommend = 1 </if> <if test="recommend != null and recommend == false"> and g.recommend = 0 </if> recommend类型是bit类型,判断时只能用0(代表false)或者1 (true) 原文地址:http

SQL Server中字段类型对应的C#中的数据类型

  数据库  C#程序  int                int32  text string bigint int64 binary System.Byte[] bit Boolean char string datetime System.DateTime decimal System.Decimal  float System.Double image  System.Byte[]  money System.Decimal nchar String ntext String  nu