Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >技巧 | C++中实现类似instanceof的方法

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

作者头像
OpenCV学堂
发布于 2024-07-18 05:46:34
发布于 2024-07-18 05:46:34
26200
代码可运行
举报
运行总次数:0
代码可运行

前言

C++有多态与继承,但是很多人开始学习C++,有时候会面临一个常见问题,就是如何向下转型,特别是不知道具体类型的时候,这个时候就希望C++ 可以向Java或者Python中有instanceof这个函数,可实际上C++中没有。但是别着急,其实C++中有两种简单的方法可以实现类似Java中的instanceof的功能。

在 C++ 中,确定对象的类型是编程中实际需求,使开发人员能够做出动态决策并执行特定于类型的操作。无论是在编译时检查类型,还是在运行时动态标识对象类型,C++ 都提供了强大的机制来获取类型信息

使用typeid.name()方法

寻找实例的类类型,代码演示如下:

使用std::is_same方法

代码实现与运行效果如下:

使用dynamic_cast

dynamic_cast方法转型是C++中一种非常杰出的方法。通过dynamic_cast操作符允许跨类层次结构动态转换指针和引用,从而在运行时确认和转换类型。代码演示如下:

完整测试源代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <typeinfo>
#include <type_traits>
#include <iostream>

using namespace cv;
using namespace std;

class Vehicles {
public:
    string make;
    string model;
    string year;
};

class Aircraft {
public:
    string make;
    string model;
    string year;
};

template <typename T>
void printType() {
    if (std::is_same<T, Aircraft>::value) {
        std::cout << "Type is Aircraft" << std::endl;
    }
    else if (std::is_same<T, Vehicles>::value) {
        std::cout << "Type is Vehicles" << std::endl;
    }
    else {
        std::cout << "Type is unknown" << std::endl;
    }
}

class Base {
public:
    virtual ~Base() {}  // Adding a virtual destructor for polymorphism
};
class Derived : public Base {
    // Class definition
};
int main(int argc, char** argv) {
    Base baseObj;
    Derived derivedObj;
    Base* ptrBase = &derivedObj;
    Derived* ptrDerived = dynamic_cast<Derived*>(ptrBase);
    if (ptrDerived) {
        std::cout << "Object is of type Derived" << std::endl;
    }
    else {
        std::cout << "Object is not of type Derived" << std::endl;
    }



    Vehicles car;
    Aircraft craft;
    const char* name1 = typeid(car).name();
    const char* name2 = typeid(craft).name();
    std::cout << "object name: " << name1 << std::endl;
    std::cout << "object name: " << name2 << std::endl;

    printType<Vehicles>();
    printType<Aircraft>();

    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-07-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenCV学堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
什么?C/C++面试过不了?因为你还没看过这个!
(为了方便记忆可以想成)被 const 修饰(在 const 后面)的值不可改变,如下文使用例子中的 p2、p3。
杨源鑫
2020/06/04
3.8K0
C/C++开发基础——动态类型转换与RTTI
C语言风格的强制类型转换不区分应用场景,C++中根据不同的应用场景提供了4种强制类型转换:
Coder-ZZ
2023/12/14
3090
C/C++开发基础——动态类型转换与RTTI
C++:从技术实现角度聊聊RTTI
第一次接触RTTI,是在<<深度探索c++对象模型>>这本书中,当时对这块的理解比较浅,可能因为知识积累不足吧。后面在工作中用到的越来越多,也逐渐加深了对其认识,但一直没有一个系统的认知,所以抽出一段时间,把这块内容整理下。
高性能架构探索
2023/06/13
1.3K0
C++:从技术实现角度聊聊RTTI
C++小知识系列之“父类指针”和dynamic_cast!
父类指针也可以称为基类指针,当父类(基类)指针指向派生类(子类)指针的时候,可以触发“多态的效果”。不过本文的重点不在“多态”,而是聊聊当父类指针和子类指针互相赋值时需要注意的问题。
老潘
2023/10/19
6720
C++小知识系列之“父类指针”和dynamic_cast!
浅析C++中的RTTI:运行时类型识别
在 C++ 编程中,我们经常需要处理各种复杂的对象类型和继承层次结构。在某些情况下,我们需要在运行时了解对象的真实类型,并根据其类型执行相应的操作。这正是 RTTI(Run-Time Type Identification)的用武之地。
程序员的园
2024/07/18
1570
浅析C++中的RTTI:运行时类型识别
惯用法之CRTP
在之前的文章<<多态实现-虚函数、函数指针以及变体>>一文中,提到了多态的几种实现方式,今天,借助这篇文章,聊聊多态的另外一种实现方式CRTP。
高性能架构探索
2022/08/25
9630
【编程陷阱】编写出色C++代码:遵循的注意事项和最佳实践
按行获取字符串:char *fgets(char *str, int n, FILE *stream);
SarPro
2024/02/20
2020
【编程陷阱】编写出色C++代码:遵循的注意事项和最佳实践
c++15.0 RTTI机制, 类型转换操作, 表达式类型推断与获取
---- c++的语法,我准备要结束了,c++东西还有很多,比如多线程,c11新特性等,我不是很熟,以后有时间在补充吧。准备写c#了,原本准备开始java语法的,但是看到简书上面好多是有关java的文章,写的都很不错(至少我感觉写不出更好的了),决定换一个方向,语法是通用的,但是还是有些不同之处,c#的.net平台,好歹是能和j2ee对立的,怎么能没有人介绍了。 ---- 知识点综述: ---- RTTI机制: 通过运行时类型识别,程序通过使用基类的指针或者引 用来检查这些指针或引用所指向对象的实际类
热心的社会主义接班人
2018/04/27
1.1K0
c++15.0 RTTI机制, 类型转换操作,  表达式类型推断与获取
解锁C++继承的奥秘:从基础到精妙实践(上)
继承是C++面向对象编程的核心特性之一,它允许程序员创建层次化的类结构,从而实现代码的重用和扩展。在这篇文章中,我们将深入探讨C++继承的基础概念,包括基类与派生类的关系、多重继承的处理、虚函数与多态的应用,以及如何在复杂系统中有效利用继承来构建可维护且扩展性强的代码架构。通过系统的学习,你将对C++继承有更深入的理解,并能够在实际开发中灵活应用这些知识。
suye
2024/10/16
2240
从零开始学C++之RTTI、dynamic_cast、typeid、类与类之间的关系uml
该文讲述了如何利用RTTI、dynamic_cast、typeid、类与类之间的关系来处理运行时多态性。作者详细讲解了RTTI、dynamic_cast、typeid、类与类之间的关系,以及如何使用这些工具来处理运行时多态性。
s1mba
2018/01/03
8850
从零开始学C++之RTTI、dynamic_cast、typeid、类与类之间的关系uml
C++强制类型转换操作符 dynamic_cast
dynamic_cast是四个强制类型转换操作符中最特殊的一个,它支持运行时识别指针或引用。
Tencent JCoder
2022/05/06
6400
C++强制类型转换操作符 dynamic_cast
C++系列笔记(七)
  C++提供了一种新的类型转换运算符,专门用于基于继承的情形,这种情形在C语言编程中并不存在。4个C++转换类型如下;
墨明棋妙27
2022/08/24
3620
[C++] 深入理解面向对象编程特性 : 继承
面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行效率的效果。 当创建一个类时,您不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类。
DevKevin
2024/08/17
2250
[C++] 深入理解面向对象编程特性 : 继承
c++:改造cmdline用于MSVC下的命令行参数解析
版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net/10km/article/details/50982993
10km
2019/05/25
2.4K0
类型转换与IO流:C++世界的变形与交互之道
在现代编程中,C++作为一种强大的面向对象编程语言,其灵活性和高效性在开发中得到了广泛应用。类型转换和输入输出流(IO流)是C++语言的两个重要组成部分。前者是数据处理与操作的桥梁,后者是数据交互的核心。掌握这些内容不仅可以提高代码的健壮性,还能显著提升开发效率与代码可读性。本文将深入探讨C++中的类型转换和IO流机制,助您在实际应用中游刃有余。
suye
2024/12/20
1850
你该知道的C++四种显式类型转换
在C语言中,我们需要做类型转换时,常常就是简单粗暴,在C++中也可以用C式强制类型转换,但是C++有它自己的一套类型转换方式。
编程珠玑
2019/10/28
2K0
【C++】继承
在社会关系中,一个人往往会拥有不同的身份,基于不同身份,有用不同的信息,比如当学生有学号,成为工人有工号等,可能会有不同的外号,但是基于人的最根本的身份,他们都要自己唯一的名称、性别等属性。
ZLRRLZ
2024/12/13
840
【C++】继承
QT 中的元对象系统
作为一名十几年的 C++ 程序员,最近一段时间使用 QT 开发程序,发现 QT 中还是有许多值得深入理解的技术。QT 不仅仅是一个应用程序开发框架,还有一些对标准 C++ 的扩充。本文和大家一起探讨 QT 中的元对象系统。
云水木石
2023/11/24
4920
QT 中的元对象系统
【C++进阶篇】像传承家族宝藏一样理解C++继承
C++是一个功能强大的面向对象编程语言,它不仅支持过程式编程,还在此基础上提供了许多用于构建复杂软件系统的面向对象特性。继承是C++中最为核心的概念之一,它允许我们通过现有的类(基类)创建新的类(派生类),从而实现代码的重用和扩展。继承是面向对象编程的三个基本特性之一(另外两个是封装和多态),在设计模式、软件架构和大型系统开发中起着至关重要的作用。
熬夜学编程的小王
2024/12/24
1600
【C++进阶篇】像传承家族宝藏一样理解C++继承
【C++ 继承】—— 青花分水、和而不同,继承中的“明明德”与“止于至善”
注意:模板类继承另一个模板类时,基类的成员函数需要通过作用域限定符或this指针访问
换一颗红豆
2025/03/25
1410
【C++ 继承】—— 青花分水、和而不同,继承中的“明明德”与“止于至善”
推荐阅读
相关推荐
什么?C/C++面试过不了?因为你还没看过这个!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验