C++ 类型判断 typeid

class A{
    virtual void f(){};
};

class B: public A{
};

 在main方法中验证

Person* p = new son();
    if (typeid(*p) == typeid(son))
    {
        std::cout << "equal" << std::endl;
    }
    else
    {
        std::cout << "not equal" << std::endl;
    }
 输出为 equal

下边俩种情况会导致输出为 not equal

1. typeid(*p) == typeid(son) 中少了"*"   写成: typeid(p) == typeid(son)

2. A 中必须要有虚函数,少了“virtual void f(){};” 不行(原理不甚了解)

网上有人的解释是: 只有在基类中含有虚函数的时候typeid才会动态识别

虚函数是用对象中隐式含有指向虚函数表的指针来实现的,而类型信息和虚函数表放在一起,从而可以用指向虚函数表的指针加减一定的偏移量来访问……因此连虚函数表和指向这个表的指针都不存在,就不可能动态识别类型信息……
时间: 2024-08-06 14:51:21

C++ 类型判断 typeid的相关文章

D语言基本类型判断 traits.d

D语言中的基本类型函数都放于 traits.d 文件中,该文件每一句就提示: Templates which extract information about types and symbols at compile time 在编译时提取有关类型和符号的信息的模板. 也就是说,这里放的模板及模板函数,都是可以用于在编译时提取类型和符号信息的. 这一部分的函数是可用来进行编译时编程的.D语言中程序分为两个部分,第一部分是编译时执行部分,第二部分是运行时执行部分. 一.符号名称函数  Symbo

JavaScript类型判断

JavaScript的数据类型可以分为:标准类型和对象类型. 标准类型有:undefined Null Boolean Date Number Object 对象类型(构造器类型)有:Boolean Date Number Object Array Date Error Function RegExp 用来判断数据类型的一般有四种方式,分别是: 1.typeof 可以识别标准类型(Null除外) 不能识别对象类型(Function除外) 2.Prototype.toString() 可以识别标准

17.C#类型判断和重载决策(九章9.4)

今天来结束第九章,聊下我们经常忽略,但是编译器会帮我们完成的"类型判断和重载决策",理解编译器如何帮我们完成,相信在写代码时会更明确,避免一些编译出错,排查的问题,让我们开发更给力. 我们知道隐式类型的数组以及将方法组转换为委托类型都需要类型推断,但将方法组作为其它方法的参数进行转换时,会显得极其复杂,我们由浅入深,一步一步来看,编译器是如何帮我们做的一些推断. 1 //定义一个泛型方法,参数分别为TInput类型和一个Func<TInput, TResult>类型的委托

NAT类型判断

本文给出NAT类型判断代码 Cone NAT or Symmetric NAT 具体实现框图如下:若SERVER A和SERVER B返回给Client的PORT1和PORT2相等,则该NAT为Cone NAT,否则为Symmetric NAT. Is Full Cone NAT? 具体实现框图如下:若Client能收到SERVER B返回的数据,则NAT为Full Cone NAT. IP-Restricted Cone NAT or Port-Restricted Cone NAT 具体实现

写python的一些坑:pocket api,类型判断,unicode写文件,raise

1.pocket api pocket新版api不允许直接发送用户名跟密码,所以需要先申请app的consumer_key,然后再get_request_token,拿到一个request_token,再通过consumer_key和request_token用浏览器访问authorize网站,之后手工点击授权,然后返回access_token.今后在应用里使用consumer_key和access_token就可以向使用账号的操作(添加.删除)了. 用python很好实现. 2.python类

js类型判断及鸭式辨型

目录 instanceof constructor 构造函数名字 鸭式辨型 三种检测对象的类方式: instanceof.constructor .构造函数名字 用法如下: 1)instanceof console.log([1,2,3] instanceof Array); true console.log([1,2,3] instanceof Object); true 尽管构造函数是原型的唯一标识,instanceof运算符的右操作数是构造函数,instanceof实际计算过程中检测的是对

【C++11学习笔记】类型判断的type_traits学习

一.简单的type_traits 我理解的type_traits是利用C++模板特性和static.enum特性定义编译器常量,例如 //std::integral_constant源码 typelate<class T, T v> struct integral_constant { static const T value = v; typedef T value_type; typedef integral_constant<T, v> type; operator valu

JavaScript 学习笔记— —类型判断

//1 判断是否为数组类型 var a=[0]; console.log(isArray(a)); function isArray(obj){ return (typeof obj=='object') && obj.constructor==Array; } console.log("2-----------------------------------") //2 判断是否为字符串类型 console.log(isString('test')); console

C#与Java对比学习:类型判断、类与接口继承、代码规范与编码习惯、常量定义(转载)

C#与Java对比学习:类型判断.类与接口继承.代码规范与编码习惯.常量定义 类型判断符号: C#:object a;  if(a is int) { }  用 is 符号判断 Java:object a; if(a instanceof Integer) { } 用 instanceof 符号判断 类与接口的继承: C#:public class MDataRow : List<MDataCell>, IDataRecord, ICustomTypeDescriptor Java:publi