66 - C++中的类型识别

news2024/11/24 18:53:12

---- 整理自狄泰软件唐佐林老师课程

1. 类型识别

在面向对象中可能出现下面的情况:

  • 基类指针指向子类对象
  • 基类引用成为子类对象的别名

这个时候就会出现问题:(由于 赋值兼容性原则 )没法通过一个父类指针判断指向的是父类对象还是子类对象

在这里插入图片描述

  • 静态类型变量(对象)自身的类型
  • 动态类型指针(引用)所指向对象的实际类型
    在这里插入图片描述

基类指针是否可以强制类型转换为子类指针取决于动态类型

1.1 问题

C++中如何得到 动态类型

1.2 解决方案:利用 多态

  • 在基类中定义虚函数返回具体的类型信息
  • 所有的派生类都必须实现类型相关的虚函数
  • 每个类中的类型虚函数都需要不同的实现

1.3 编程实验:动态类型识别

#include <iostream>
#include <string>

using namespace std;

class Base
{
public:
    virtual string type()
    {
        return "Base";
    }
};

class Derived : public Base
{
public:
    string type()
    {
        return "Derived";
    }
    
    void printf()
    {
        cout << "I'm a Derived." << endl;
    }
};

class Child : public Base
{
public:
    string type()
    {
        return "Child";
    }
};

void test(Base* b)
{
    /* 危险的转换方式 */
    // Derived* d = static_cast<Derived*>(b);
    
    if( b->type() == "Derived" )
    {
        Derived* d = static_cast<Derived*>(b);
        
        d->printf();
    }
    
    // cout << dynamic_cast<Derived*>(b) << endl;
}

int main(int argc, char *argv[])
{
    Base b;
    Derived d;
    Child c;
    
    test(&b);
    test(&d);
    test(&c);
    
    return 0;
}

在这里插入图片描述

向上/向下转换可参看 55 - 经典问题解析四(动态内存分配&虚函数&继承中的强制类型转换)

1.4 多态解决方案的缺陷

  • 必须从基类开始提供类型虚函数
  • 所有的派生类都必须重写类型虚函数
  • 每个派生类的类型名必须唯一

1.5 类型识别关键字

  • C++提供了 typeid关键字 用于获取类型信息
    • typeid关键字 返回对应参数的 类型信息
    • typeid返回一个type_info类对象
    • 当typeid的参数为NULL时将抛出异常

1.5.1 typeid关键字的使用

int i = 0;			
const type_info& tiv = typeid(i);			
const type_info& tii = typeid(int);	
cout << (tiv == tii) << endl;	

1.5.2 typeid的注意事项

  • 当参数为 类型 时:返回静态类型信息
  • 当参数为 变量 时:
    • 不存在虚函数表 – 返回静态类型信息
    • 存在虚函数表 – 返回动态类型信息

1.5.3 编程实验:typeid类型识别

#include <iostream>
#include <string>
#include <typeinfo>

using namespace std;

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

class Derived : public Base
{
public:
    void printf()
    {
        cout << "I'm a Derived." << endl;
    }
};

void test(Base* b)
{
    const type_info& tb = typeid(*b);
    
    cout << tb.name() << endl;
}

int main(int argc, char *argv[])
{
    int i = 0;
    
    const type_info& tiv = typeid(i);
    const type_info& tii = typeid(int);
    
    cout << (tiv == tii) << endl;
    
    Base b;
    Derived d;
    
    test(&b);
    test(&d);
    
    return 0;
}

在这里插入图片描述
在这里插入图片描述

2. 小结

  • C++中有静态类型和动态类型的概念
  • 利用多态能够实现对象的动态类型识别
  • typeid是专用于 类型识别 的关键字
  • typeid能够返回对象的动态类型信息

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/48844.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ZMQ之多线程编程

使用ZMQ进行多线程编程&#xff08;MT编程&#xff09;将会是一种享受。在多线程中使用ZMQ套接字时&#xff0c;你不需要考虑额外的东西&#xff0c;让它们自如地运作就好。 使用ZMQ进行多线程编程时&#xff0c;不需要考虑互斥、锁、或其他并发程序中要考虑的因素&#xff0c;…

安卓手机配哪款蓝牙耳机?最适合安卓手机的蓝牙耳机

蓝牙耳机火了之后&#xff0c;各个品牌就开始涌现&#xff0c;就连手机厂家也开始涉足蓝牙耳机领域。安卓手机这几年也是受到很多人的喜爱&#xff0c;那么安卓手机应该怎么选择蓝牙耳机呢&#xff1f;下面我们一起来看看当前值得入手的蓝牙耳机吧&#xff01; 第一款&#xf…

文章向大家介绍安卓逆向,解决app抓包抓不到的问题,主要包括安卓逆向,解决app抓包抓不到的问题使用实例、应用技巧

本文章向大家介绍安卓逆向&#xff0c;解决app抓包抓不到的问题&#xff0c;主要包括安卓逆向&#xff0c;解决app抓包抓不到的问题使用实例、应用技巧、基本知识点总结和需要注意事项&#xff0c;具有一定的参考价值&#xff0c;需要的朋友可以参考一下。 有时候app抓不到包&…

透视金融科技Q3财报:规模效应显现,深化小微服务覆盖面

面对复杂的经济环境&#xff0c;助力实体经济发展、服务小微企业仍是金融领域的挑战和机遇。 近日&#xff0c;在美上市的多家金融科技公司先后公布了截至2022年9月30日的2022年第三季度财报。在国内疫情多点散发、经济复苏承压背景下&#xff0c;金融科技企业们仍展现了强大的…

计算机毕业设计之java+ssm美味厨房点餐系统

项目介绍 本美味厨房点餐管理系统是针对目前美味厨房点餐管理的实际需求&#xff0c;从实际工作出发&#xff0c;对过去的美味厨房点餐管理系统存在的问题进行分析&#xff0c;结合计算机系统的结构、概念、模型、原理、方法&#xff0c;在计算机各种优势的情况下&#xff0c;…

HTML+CSS项目案例

文章目录1、成绩表2、青蒿素3、静夜思4、毕业季再见青春5、个人信息6、咖啡1、成绩表 案例演示&#xff1a;&#xff08;table、tr、td、th的练习&#xff09; 实现代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8">&…

java集合框架------Collection接口

导语 对于多个同一类型的数据进行存放和处理时&#xff0c;相信很多人想到的第一个方法就是使用数组&#xff0c;但是数组的使用有非常多的局限性&#xff0c;比如长度不够啦&#xff0c;增删操作需要移动多个元素啦。 对于此种问题&#xff0c;采用集合才是最好的解决办法&a…

[附源码]计算机毕业设计springboot基于Web的绿色环保网站

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

uni-fab彩色图标按钮

资源已经上传了。大家直接可以引用uni-fab就可以https://download.csdn.net/download/qq_39504612/87216560 1. 下载彩色图标 1.首先&#xff0c;从iconfont官网&#xff08;iconfont-阿里巴巴矢量图标库&#xff09;选择自己需要的图标加入项目中&#xff0c;点击下载至本地…

Alibaba Nacos 客户端注册从客户端项目到nacos项目的整体流程核心梳理

客户端篇&#xff1a; 1、NacosAutoServiceRegistration类继承了AbstractAutoServiceRegistration类&#xff0c;AbstractAutoServiceRegistration类实现了ApplicationListener&#xff0c;实现了ApplicationListener接口的类都必须实现一个onApplicationEvent方法&#xff0c;…

CSDN页面左上角出现红色“不安全 | https” ,并且把鼠标放在上面的头像和消息时无法下拉菜单

CSDN页面左上角出现红色“不安全 | https”&#xff0c;如下图&#xff1a; 我不说多了&#xff0c;直接说吧 “不安全 | https”&#xff0c;先点击“不安全”看看&#xff1a; 点击“证书无效”&#xff0c;—>“基本信息” 点击“详细信息” 这三个截图都是有问题…

【元胞自动机】元胞自动机双边教室疏散【含Matlab源码 1208期】

⛄一、元胞自动机简介 1 元胞自动机发展历程 最初的元胞自动机是由冯 诺依曼在 1950 年代为模拟生物 细胞的自我复制而提出的. 但是并未受到学术界重视. 1970 年, 剑桥大学的约翰 何顿 康威设计了一个电脑游戏 “生命游戏” 后, 元胞自动机才吸引了科学家们的注意. 1983 年…

Vue3 | Vue3与Vue2相比的优势、创建项目的方式以及一些常见的Compositioin API

一、Vue3与Vue2相比&#xff0c;有哪些优势呢&#xff1f; 1、性能的提升&#xff1a; 打包大小减少41%初次渲染快55%&#xff0c;更新渲染快133%内存减少54%2、源码的升级 使用Proxy代替defineProperty实现响应式重写虚拟DOM的实现和Tree-Shaking3、新的特性 Composition API&…

[附源码]计算机毕业设计JAVA小型医院药品及门诊管理

[附源码]计算机毕业设计JAVA小型医院药品及门诊管理 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM …

Vue3 - Pinia 状态管理(环境搭建安装及各属性使用教程)详细使用教程

目录初识 Pinia介绍环境搭建getters 属性actions 属性Pinia 模块化Pinia 解构 storePinia 数据持久化SEO初识 Pinia vue 官方文档&#xff1a;https://cn.vuejs.org/guide/scaling-up/state-management.html#pinia Pinia 官方文档&#xff1a;https://pinia.web3doc.top/ pinia…

hiveSql冷门但好用函数 --持续更新

hiveSql常用函数字符串函数to_jsonjson_tupletranslate日期函数next_day字符串函数 to_json 将STRUCT类型的数据转化为json格式字符串&#xff0c;此处需要另外学习一个named_struct()函数:自定义结构化数据的KVnamed_struct(k1,v1,k2,v2…)示例&#xff1a; select named_s…

吉时利2602A数字源表-安泰测试

吉时利Keithley2602A双通道系统数字电源 Keithley/吉时利2602A数字源表数字源表是吉时利新的I-V源测量仪器&#xff0c;可用作台式I-V特征分析工具或者构成多通道I-V测试系统的组成模块。作为台式仪器使用时&#xff0c;2600A系列仪器提供了一个嵌入式TSP Express软件工具&…

函数定义、this指向、闭包等

1、函数的定义和调用 1.1函数的定义方式 1、自定义函数&#xff08;命名函数&#xff09; 2、函数表达式&#xff08;匿名函数&#xff09; 3、利用 new Function (‘参数1’, ‘参数2’, ‘函数体’) 1、自定义函数&#xff08;命名函数&#xff09; function fn() {}2、函…

微服务框架 SpringCloud微服务架构 6 Nacos 配置管理 6.1 Nacos 实现配置管理

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构6 Nacos 配置管理6.1 Nacos 实现配置管理6.1.1 统一配置管理6.1.2 直接开干…

Chapter9.4:线性系统的状态空间分析与综合(下)

此系列属于胡寿松《自动控制原理题海与考研指导》(第三版)习题精选&#xff0c;仅包含部分经典习题&#xff0c;需要完整版习题答案请自行查找&#xff0c;本系列属于知识点巩固部分&#xff0c;搭配如下几个系列进行学习&#xff0c;可用于期末考试和考研复习。 自动控制原理(…