首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何获取void*指针的typeid?

获取void指针的typeid是在C++中通过RTTI(Run-Time Type Information)来实现的。RTTI是C++的一种特性,允许在运行时获取对象的类型信息。要获取void指针的typeid,需要先将其转换为实际的对象类型,然后使用typeid操作符来获取类型信息。

以下是一个示例代码:

代码语言:cpp
复制
#include<iostream>
#include <typeinfo>

class Base {
public:
    virtual ~Base() {}
};

class Derived : public Base {};

int main() {
    Base* b = new Derived();
    void* p = dynamic_cast<void*>(b);
    const std::type_info& t = typeid(*static_cast<Base*>(p));
    std::cout << t.name()<< std::endl;
    delete b;
    return 0;
}

在这个示例中,我们首先创建了一个Base类的派生类Derived,并且在Base类中添加了一个虚拟析构函数,以便在运行时正确地进行类型转换。然后我们创建了一个Base类的指针,并将其指向一个Derived类的实例。接着我们将该指针转换为void*类型,并使用typeid操作符获取该指针所指向对象的类型信息。最后我们将类型信息打印出来,并释放内存。

需要注意的是,在使用typeid操作符之前,需要将void指针转换回原始的对象类型,否则会导致编译错误。在这个示例中,我们使用了static_cast来将void指针转换回Base*类型,然后使用typeid操作符获取类型信息。

总之,要获取void*指针的typeid,需要先将其转换为实际的对象类型,然后使用typeid操作符来获取类型信息。在实际应用中,可以根据获取到的类型信息来实现不同的逻辑处理。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

初识指针指针指针变量、如何理解地址、指针类型意义、void*指针、野指针、空指针)(笔记)

2.32位平台下地址是32个bit,指针变量大小是4个字节 64位平台下地址是64个bit,指针变量大小是8个字节 三、如何理解地址: 计算机中硬件单元要互相协同工作(协同:互相进行数据传递...*指针:无具体指针(泛型指针) 这种类型指针可以用来接受任意类型地址,但也有局限性, void*类型指针,局限性在于他不能直接进行指针+-整数和解引用运算 有什么用: 一般void...*类型指针是使用在函数参数部分,用来接收不同数据类型地址, 这样可以实现泛型编程效果,使得一个函数来处理多种类型数据 注意: void*类型指针不能直接进行解引用操作 void...&a;//char* //*pv = 20;//err void*类型指针不能直接进行解引用操作 //pv++;//err void* 类型指针也不能加减一操作 return 0;...*p);// return 0; } 如何规避野指针?

14810
  • C语言中函数指针(*(void(*)())0)();

    个人总结一下C语言中有关函数知识,如有问题请留言指明*v* (*(void(*)())0)(); 其实这个语句只有在微处理器最底层才有可能被调用,因为应用层几乎没有直接对一个地址进行操作。...第三个问题:这个地方也是比较绕地方,我们直接定义一个函数指针时要指明函数返回值类型以及入参类型等,正常我们定义一个有一个int入参没有返回值函数指针变量是 void (*funcp)(int);,...函数指针变量和整形变量相对比的话,void (*)(int) 就相当于int,而变量名funcp就和a等同了。...看到这里,再回头看看上面的(*(void(*)())0)();语句,你会发现(void(*)())0是将0强转成无返回值无入参函数指针地址,外面一层就是取地址执行函数。...函数指针相关知识点还是很重要,在一些较大项目中,我们经常会看到这样语句 typedef void (*HANDLER) (int);,这是定义一种函数指针类型,后面直接使用HANDLER就可以定义入参一个

    1.8K20

    你必须知道指针基础-7.void指针与函数指针

    一、不能动“地址”—void指针 1.1 void指针初探 ?   void *表示一个“不知道类型”指针,也就不知道从这个指针地址开始多少字节为一个数据。...PS:void *就是一个不能动“地址”,在进行&、移动指针之前必须转型为类型指针。 1.2 void指针用途 ?   ...这里我们看一下我们之前了解memset函数,其第一个参数就是一个void指针,它可以帮我们屏蔽各种不同类型指针差异。...函数指针是一个指向函数指针,我们可以在C中轻松地定义一个函数指针: typedef void (*intFunc)(int i);   这里我们定义了一个无返回值,只有一个int类型参数函数指针intFunc...其所指向函数应该是一个返回值为int类型,参数为两个void指针

    94520

    浅析C++中RTTI:运行时类型识别

    使用方法 在C++中,我们通常使用两种主要 RTTI 操作符:typeid 和 dynamic_cast。 typeid操作符 typeid 操作符用于获取一个对象/类型类型信息。...它返回一个 std::type_info 类型对象,该对象包含有关表达式类型信息。其中可读性强是name方法获取类型名称。...如果转型不安全,dynamic_cast返回一个空指针(对于指针类型)或抛出std::bad_cast异常(对于引用类型)。.../引用向子类指针/引用转换、支持子类指针/引用向子类指针/引用转换,不支持指向基类基类指针/引用向子类指针/引用转换。...总结 运行时类型信息(RTTI)是C++语言中一个强大特性,它允许我们在运行时获取对象类型信息。通过typeid操作符和dynamic_cast操作符,可以方便地进行类型查询和安全向下转型。

    9310

    RTTI简介

    本文将简略介绍 RTTI 一些背景知识、描述 RTTI 概念,并通过具体例子和代码介绍什么时候使用以及如何使用 RTTI。...1.2.2typeid动态类型判断 typeid更多时候是在运行时用来动态地确定指针或引用所指向对象类型,这时要求typeid所操作对象一定要拥有虚函数。见下面的程序。...确实能够在程序运行期间动态地判断指针所指对象实际类型。...使用引用可以到达同样效果,因为引用底层实现就是指针。...(2)C++中一切“动态”机制,包括虚函数、RTTI等,都必须通过指针或引用来实现。换句话说,指针所指对象或引用所绑定对象,在运行阶段可能与声明指针或引用时类型不一致。

    52930

    RTTI简介

    本文将简略介绍 RTTI 一些背景知识、描述 RTTI 概念,并通过具体例子和代码介绍什么时候使用以及如何使用 RTTI。...1.2.2typeid动态类型判断 typeid更多时候是在运行时用来动态地确定指针或引用所指向对象类型,这时要求typeid所操作对象一定要拥有虚函数。见下面的程序。...确实能够在程序运行期间动态地判断指针所指对象实际类型。...使用引用可以到达同样效果,因为引用底层实现就是指针。...(2)C++中一切“动态”机制,包括虚函数、RTTI等,都必须通过指针或引用来实现。换句话说,指针所指对象或引用所绑定对象,在运行阶段可能与声明指针或引用时类型不一致。

    1.4K20

    c++15.0 RTTI机制, 类型转换操作, 表达式类型推断与获取

    ---- 知识点综述: ---- RTTI机制: 通过运行时类型识别,程序通过使用基类指针或者引 用来检查这些指针或引用所指向对象实际类型。...操作符: dynamic_cast 1.0 将基类指针或引用安全转换为其它派生类指针或引用。...typeid //换回指针或引用所指向类型 类型转换操作 static_cast, 形式 static_cast(源数据类型表达式) 比如: int a;...typeinfo 表达式类型推断与获取,好像是c11新特性 auto:当编译器能够在一个变量声明时候就推断出它类型 获取vector迭代器 以前 vector<double...---- 参考文章: C++中RTTI机制剖析 C++中四种类型转换方式 比较C++中4种类型转换方式 C++11 新特性之自动类型推断和类型获取

    1K80

    【专业技术】C++ RTTI及“反射”技术

    本文将简略介绍 RTTI 一些背景知识、描述 RTTI 概念,并通过具体例子和代码介绍什么时候使用以及如何使用 RTTI;本文还将详细描述两个重要 RTTI 运算符使用方法,它们是 typeid...每每涉及到处理异类容器和根基类层次(如 MFC)时,不可避免要对对象类型进行动态判断,也就是动态类型侦测。如何确定对象动态类型呢?...为了使用 RTTI 来动态定制菜单,文件管理器必须侦测每个文件动态类型。利用 运算符 typeid 可以获取与某个对象关联运行时类型信息。typeid 有一个参数,传递对象或类型名。...因此,为了确定 x 动态类型是不是Y,可以用表达式:typeid(x) == typeid(Y)实现: #include // typeid 需要头文件  void menu...用它来确定某个对象是 MediaFile 对象还是它派生类对象。dynamic_cast 常用于从多态编程基类指针向派生类指针向下类型转换。

    2.2K50

    C++:从技术实现角度聊聊RTTI

    如果类型对象至少包含一个虚函数,那么typeid操作符类型是运行时事情,也就是说在运行时才能获取到其真正类型信息;否则,在编译期就能获取其具体类型,甚至在某些情况下,可以对typeid()结果直接进行替换...多态 多态,我们知道经常用于运行时,也就是说在运行时刻才会知道其指针或者引用指向具体类型,如果要对一个包含虚函数对象获取其类型信息(typeid),那么也是在运行时才能具体知道,举例如下: #include...那么typeinfo又是如何获取呢?...综上内容,可以知道,对于存在虚函数类来说,其对象typeinfo信息存储在该类虚函数表中。在运行时刻,根据指针实际指向,获取其typeinfo()信息,从而进行相关操作。...origin在这里作用是offsetof,反向获取whole_object指针

    1K90

    如何优雅解决空指针

    一、介绍 在实际系统运行过程中,难免会出现报NullPointerException空指针错误,造成这样本质原因就是数据或者对象为空,导致程序进一步执行时候报错!...针对这种情况,我们可以引入了空对象模式以此来使我们代码变更优雅一点。 废话也不多说了,代码直接撸起来! 二、程序示例 下面,我们以获取从一个书籍库中获取书籍为例,实现过程如下!...//书名 protected String bookName; //判断是否存在 public abstract boolean isExist(); //获取书名...new NullObjectBook(); } } 最后,编写一个测试客户端,如下: public class NullObjectClient { public static void...四、总结 在写代码时候我们经常会遇到空指针,为了避免空指针发生需要做一些判断。如果是复杂对象的话,还需要一层层地去判断。

    1K20

    c++继承 基类 派生类 虚函数

    0; }  运行结果如下:    上面结果说明一个基类指针是可以指向其派生类对象。...此时基类和派生类布局如下:     vfptr指针大小为4(32位机器)。因此基类字节数为8,派生类为12。...typeid()可以动态获取类型。   main函数中,生成了一个派生类对象。...pb是一个指针类型,它类型只和定义点有关,因此打印出来pb类型为class Base类型;而pb是一个自定义类型,动态获取类型时,先通过指针pb解引用找到派生类对象,通过vfptr找到vftable...首先通过指针所指向对象找到vfptr,再找到vftable,获取到Show函数入口地址,此时 &Derive::Show中存放是派生类虚函数入口地址,因此调用是派生类中Show()函数。

    1.1K20

    那些陌生C++关键字

    图1 C++ 关键字 一、typeid 从名字直观看来,该关键字应该是获取语言元素类型ID。其实它和sizeof类似,是一个类型运算符。...有时候代码可能需要获取某个变量或者类型名字,这时候使用typeid就比较合适。...使用格式:typeid(int)或typeid(i+1) 这样操作后返回有个type_info类型对象,比较常用对象成员函数一般有比较是否相等和获取类型名。...例如: typeid(int).name();//获取int类型名,结果为“int”。 typeid(1)!= typeid(1.0);//比较表达式类型,结果为true。...例如: typedef void (*FuncPtr)();//funcPtr是指向无参无返回值类型函数指针 int func()//一个无参返回整数函数定义 { return 0; } FuncPtr

    94770

    《C++Primer》第十九章

    实际上我们根本无法自定义new表达式或者delete表达式行为。一条new表达式执行过程总是先调用operator new函数以获取内存空间,然后在得到内存空间中构造对象。...和往常一样,顶层const被忽略,如果表达式是一个引用,则typeid返回该引用所引对象类型。不过当typeid作用于数组或者函数时,并不会执行向指针标准类型转换。...比如我们对数组a执行typeid(a)。所得结果是数组类型而非指针类型。 当运算对象不属于类类型或者是一个不包含任何虚函数类时,typeid运算符指示是运算对象静态类型。...: bp类型是指向Base指针 if (typeid(bp) == typeid(Derived)) { // 此处代码永远不会执行 } 当typeid作用于指针时(而非指针指向对象),返回结果是该指针静态编译时类型...unsigned int中,这些二进制位能否压缩到一个整数中以及如何压缩是与机器相关 取地址运算符&不能作用域位域,因此任何指针都无法指向类位域 最好将位域设为无符号类型,存储在带符号类型中位域行为将因具体实现而定

    1.3K10

    C++入门知识(二)

    5.引用和指针区别 ★ 相同点: 都是地址概念; 指针指向一块内存,它内容是所指内存地址;引用是某块内存别名。 ★ 区别: 1. 指针是一个实体,而引用仅是个别名; 2....引用不能为空,指针可以为空; 6. “sizeof 引用”得到是所指向变量(对象)大小,而“sizeof 指针”得到指针本身(所指向变量或对象地址)大小; 7....【注意】使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto实际类型。 auto如何使用?...; auto& f = a; cout << typeid(b).name() << endl; cout << typeid(c).name() << endl; cout << typeid...在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占字节数相同。 为了提高代码健壮性,在后续表示指针空值时建议最好使用nullptr。

    52610

    如何有效避免空指针异常

    指针异常如何避免,听听老司机分享一些条件反射式使用经验。 01 开篇 空指针异常在新手程序员里面非常常见,不只是新手,所有初级、中级甚至是高级都不可避免。...本期主题由来是因为有这样一位同学,他问到了这样一个问题:“什么时候需要去判空,没有这样一个意识。” 我相信这个问题不只是他,很多新手程序员都没有这样意识,不小心就出现一个空指针异常 ?...02 列表判空 当list为空时候,null.size,这时候就会报一个空指针异常 我们应该养成一个习惯,当你要去循环一个列表时候,就应该去判一下空 列表判空用CollectionUtils.isEmpty...03 实体判空 通过某个实体去get属性时候,应该加一个非空判断,否则会报空指针异常 实体对象判空,使用ObjectUtils.isEmpty() ?...04 计算判空 数据库中经常会存一些金额,比如金额、数量等,如果库里存不是0而不是空,此时对数值进行计算,就会出现空指针异常 ?

    1.9K30

    技巧 | C++中实现类似instanceof方法

    前言 C++有多态与继承,但是很多人开始学习C++,有时候会面临一个常见问题,就是如何向下转型,特别是不知道具体类型时候,这个时候就希望C++ 可以向Java或者Python中有instanceof这个函数...但是别着急,其实C++中有两种简单方法可以实现类似Java中instanceof功能。 在 C++ 中,确定对象类型是编程中实际需求,使开发人员能够做出动态决策并执行特定于类型操作。...无论是在编译时检查类型,还是在运行时动态标识对象类型,C++ 都提供了强大机制来获取类型信息 使用typeid.name()方法 寻找实例类类型,代码演示如下: 使用std::is_same方法 代码实现与运行效果如下...通过dynamic_cast操作符允许跨类层次结构动态转换指针和引用,从而在运行时确认和转换类型。...class Aircraft { public: string make; string model; string year; }; template void

    11610
    领券