0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C++中动态类型的识别

汽车电子威廉希尔官方网站 来源:嵌入式情报局 作者:情报小哥 2023-02-21 10:24 次阅读

大家好,我是情报小哥~

1、所要解决的问题

在前面的相同专辑文章中,跟大家介绍过虚函数,其中提到了基类的指针可以指向派生类,同时基类的引用也可以成为派生类的别名。

比如是非常经典的例子:

#include 
using namespace std;

class Parent
{
 public:
  virtual void print(void)
  {
   cout<<"Parent print"<class Child: public Parent
{
 public:
  void print(void)
  {
   cout<<"child print"<void Test1(Parent *ptr)
{
    ptr->print();
}

void Test2(Parent& p)
{
    p.print();
}

int main(int argc, char** argv) {
 
    Child child;
    Parent parent;

    Test1(&child);
    Test1(&parent);
    
    Test2(child);
    Test2(parent);
   
    return 0;
}

这样其输出的结果如下:

图片

由于存在虚函数的重写,所以其函数调用都是跟随传入的对象类型,这就是多态;当然如果此例子中Parent类中的print没有virtual虚函数标识,则编译器会认为传入的就是父类指针,从而只会调用父类的成员。

而从Test1或者Test2对象内部看来并不能知道传参是子类型还是父类型:

void Test1(Parent *ptr)
{
    Child* ptrChild = (Child *)ptr;
 
    ptrChild->dosomething(); //调用派生类成员
}

如上代码如果传入的参数是子类对象,那么函数内部用子类类型指向该对象是正常运行的,但如果此时传入的是父类对象,而强制转化为子类指针来使用,则程序就有可能出现未知错误。

所以这里也引出来两个概念:静态类型与动态类型

静态类型: 即编译期间所确定的变量类型;

动态类型: 在运行过程中指针或者引用所指向对象的实际类型。

基于上面的风险,我们急需有一种手段来识别变量的动态类型,以进行相应的处理,我们通常叫其为:RTTI(Run-Time Type Identification,运行时类型识别)

2、进行动态类型识别的方法

进行动态类型识别的方法挺多的,比如利用多态对派生类进行相应ID的标识等等,不过推荐还是采用typeid的方式。

typeid关键字能够获得任意变量的类型信息,也是C++专门提供用于类型识别的方式。

那么下面我们就用一个例程在看看typeid如何使用的:

#include 
#include 

using namespace std;

class Parent
{
 public:
  virtual void print(void)
  {
   cout<<"Parent print"<class Child: public Parent
{
 public:
  void print(void)
  {
   cout<<"child print"<void dosomething(void)
  {
   cout<<"dosomething"<void Test1(Parent *ptr)
{

    if( typeid(*ptr) == typeid(Child) ) //具体使用方式 Child
    {
      Child* ptrChild = dynamic_cast(ptr);

        cout<<"**Dynamic Type: "<<"Child"<dosomething();
        
    } 
    else if( typeid(*ptr) == typeid(Parent) ) //Parent
    {
        cout<<"**Dynamic Type: "<<"Parent"<print();
    }

}

void Test2(Parent& p)
{
    if( typeid(p) == typeid(Child) ) //具体使用方式 Child
    {
       Child& ptrChild = (Child&)p;

        cout<<"**Dynamic Type: "<<"Child"<dosomething();
        
    } 
    else if( typeid(p) == typeid(Parent) ) //Parent
    {
        cout<<"**Dynamic Type: "<<"Parent"<print();
    }
}

int main(int argc, char** argv) {
 
    Child child;
    Parent parent;

    Test1(&child);
    Test1(&parent);
    
    cout<Test2(child);
    Test2(parent);
    
    cout<const type_info& tparent = typeid(parent);
    const type_info& tchild = typeid(child);
 
    cout<name()<name()<return 0;
}

其输出结果如下:

图片

结果看每种指针或者引用的类型均可以动态且正确的获得识别,挺方便的。

最后有几点需要注意下:

1、typeid返回值是名为type_info的标准库类型的对象引用。

2、type_Info的name返回的是一个字符串,且其类名与实际程序中类型不一定是一致的,但是肯定是唯一标识字符串,通过上面输出结果大家也是可以了解到的。

最 后

好了,这里小哥就简单介绍了C++中动态识别机制的使用,本系列文章后续还会更新,记得关注学习哦。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 指针
    +关注

    关注

    1

    文章

    480

    浏览量

    70553
  • 虚函数
    +关注

    关注

    0

    文章

    8

    浏览量

    1698
  • 引用
    +关注

    关注

    0

    文章

    8

    浏览量

    7730
收藏 人收藏

    评论

    相关推荐

    C++打印类型名称的分析与实现

    打印类型名称,听起来像是一个很简单的需求,但在目前的C++当中,并非易事。
    发表于 10-20 14:08 1396次阅读

    labview调用c++的取地址符对应labview什么数据类型

    调用c++动态链接库,有一个参数是地址类&data,labview对应什么数据类型?急急急!!!!!!!!!!求大神帮忙
    发表于 08-18 11:47

    关于C++的函数重载机制

    ,而且同类型的同名函数能够更好地发挥多种功能.宏观体现就是使用一个函数名字可以完成各种同类型但是不同细节的函数调用(例如,参数的类型不同,或者仅仅是多了一个控制量参数......).所以C++
    发表于 10-01 17:18

    C++的四种类型转换分别是哪些?C++析构函数的作用是什么

    C++的四种类型转换分别是哪些?C++析构函数的作用是什么?在C语言中关键字static主要
    发表于 12-24 06:57

    C++静态分析对泛型构件的识别与表示方法

    本文从C++静态分析的角度出发,介绍了模板和泛型构件威廉希尔官方网站 、一个C++静态分析器实现对模板和基本泛型构件的分析和识别方法、以及一种基于UML 的泛型构件的表示方法。[关
    发表于 08-17 11:16 14次下载

    人脸识别C/C++源代码

    人脸识别C/C++源代码 将生物特征识别应用于人脸,实际上是包含两个方面:第一,从图像或视频帧检测人脸,即所谓的“人脸检测”(face
    发表于 02-09 16:05 184次下载

    C++动态多态和静态多态

    多态是 C++ 面向对象威廉希尔官方网站 的核心机制之一包含静态多态和动态多态它们之间有一定的相似性但是应用范围不同该文论述了这种相似性并重点论述了以模板实现的静态多态的应用范围
    发表于 06-29 15:41 41次下载
    <b class='flag-5'>C++</b>的<b class='flag-5'>动态</b>多态和静态多态

    C++语法的外围基础

    程序对内存空间的动态分配的频繁程度要求简化语言的相关语法的格式。C++语法规定new算符等效于C语言中mal1oc一类的函数功能;free算符等效于C语言中free一类的函数功能。其格
    发表于 03-15 16:55 10次下载

    c++ 之布尔类型和引用的学习总结

    c语言里面我们知道是没有布尔数据类型的,而在C++添加了布尔数据类型(bool),它的取值是:true或者false(也就是1或者0),
    的头像 发表于 12-24 18:03 593次阅读

    现代C++之模板类型推导

    传统C++,参数的类型都必须明确定义,这其实对我们快速进行编码没有任何帮助,尤其是当我们面对一大堆复杂的模板类型时,必须明确的指出变量的类型
    的头像 发表于 03-02 16:18 878次阅读

    C++入门之string

    前一篇文章我们已经了解了C++的基本类型C++还提供了很多抽象数据类型,例如字符串string,string包含多个字符,以及可变长度的
    的头像 发表于 03-17 13:58 561次阅读

    C++的引用和指针

    之前的文章我们已经介绍了C++的基本类型如int,bool和double等,除了基本类型C++还有一些更复杂的数据
    的头像 发表于 03-17 14:00 632次阅读

    CC++编写环境下LabVIEW如何调用动态库?

    C语言编写的动态链接库相比,不同的地方在于extern int “C” __declspec(dllexport) add(int x,int y) 这一导出语句,在C代码
    发表于 06-11 09:15 7744次阅读
    <b class='flag-5'>C</b>和<b class='flag-5'>C++</b>编写环境下LabVIEW如何调用<b class='flag-5'>动态</b>库?

    动态数组和C++ std::vector详解

    std::vector是C++的默认动态数组,其与array最大的区别在于vector的数组是动态的,即其大小可以在运行时更改。std::vector是封装动态数组的顺序容器,且该容器
    的头像 发表于 07-19 11:07 966次阅读

    C++实现类似instanceof的方法

    函数,可实际上C++没有。但是别着急,其实C++中有两种简单的方法可以实现类似Java的instanceof的功能。 在 C++
    的头像 发表于 07-18 10:16 575次阅读
    <b class='flag-5'>C++</b><b class='flag-5'>中</b>实现类似instanceof的方法