首页 > 编程语言 >C++零碎知识点

C++零碎知识点

时间:2024-01-16 10:13:04浏览次数:24  
标签:知识点 类型信息 typeid 多态 零碎 C++ 类型 RTTI

目录


RTTI 运行时类型信息

在C++中,RTTI(Run-Time Type Information,运行时类型信息)是一种机制,允许在程序执行期间确定对象的类型。RTTI是为了解决许多类库供应商自行实现此功能而导致的不兼容性问题而添加到C++语言中的。RTTI的主要目的是允许在运行时获取对象的实际类型信息。

在C++中,有三个主要的语言元素与运行时类型信息相关联:

  1. dynamic_cast运算符:用于多态类型的转换。
  2. typeid运算符:用于识别对象的确切类型。
  3. type_info类:用于保存typeid运算符返回的类型信息。

需要注意的是,RTTI主要适用于指针,但其中讨论的概念也适用于引用。RTTI仅适用于多态类,这意味着它们必须至少有一个虚拟函数。

C++中的RTTI允许在程序运行时获取对象的类型信息,这对于执行某些类型安全的操作和决策非常有用。

当在C++中使用多态时,RTTI可以用于确定对象的实际类型。以下是一个简单的示例,演示了如何使用dynamic_casttypeid来实现多态类型的转换和类型识别。

#include <iostream>
#include <typeinfo>

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

class Derived : public Base {
public:
    void specificFunction() {
        std::cout << "This is a function specific to Derived class" << std::endl;
    }
};

int main() {
    Base* basePtr = new Derived;

    // 使用dynamic_cast进行类型转换
    Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);
    if (derivedPtr) {
        derivedPtr->specificFunction();
    }

    // 使用typeid获取对象的类型信息
    if (typeid(*basePtr) == typeid(Derived)) {
        std::cout << "basePtr指向的对象是Derived类型" << std::endl;
    }

    delete basePtr;
    return 0;
}

在这个例子中,Base类是一个多态基类,Derived类是它的派生类。在main函数中,我们创建了一个Derived类的实例,并将其赋值给一个Base类的指针。然后,我们使用dynamic_castBase类的指针转换为Derived类的指针,并调用specificFunction。接着,我们使用typeid来检查basePtr指向的对象是否是Derived类型。

这个例子展示了如何在C++中使用RTTI来进行类型转换和类型识别,以实现多态行为。

使用场景
在实际项目中,我曾经遇到过使用RTTI的场景。一个具体的例子是在一个图形用户界面(GUI)库的开发中。在这个库中,我们需要处理各种不同类型的图形元素,例如按钮、文本框、复选框等。这些图形元素都是从一个基类派生而来的,因此在处理用户交互时,需要根据用户的操作来确定实际的图形元素类型。

在这种情况下,我们使用了RTTI来确定用户交互所涉及的图形元素的实际类型。通过使用dynamic_casttypeid,我们能够在运行时确定用户操作的对象类型,并执行相应的操作。例如,当用户点击一个按钮时,我们可以使用RTTI来确定该按钮的实际类型,并触发相应的事件处理。

总的来说,使用RTTI使得我们能够在运行时动态地确定对象的类型,从而实现了更加灵活和可扩展的图形用户界面库。这种经验让我意识到RTTI在处理多态类型时的价值,以及它在实际项目中的实用性。

标签:知识点,类型信息,typeid,多态,零碎,C++,类型,RTTI
From: https://www.cnblogs.com/yubo-guan/p/17967013

相关文章

  • Qt/C++中英输入法/嵌入式输入法/小数字面板/简繁切换/特殊字符/支持Qt456
    一、前言在嵌入式板子上由于没有系统层面的输入法支持,所以都绕不开一个问题,那就是在需要输入的UI软件中,必须提供一个输入法来进行输入,大概从Qt5.7开始官方提供了输入法的源码,作为插件的形式加入到Qt中,这里需要特别提示的是,该源码是gpl的,商业应用对这个比较不感冒,可能更愿意自己基......
  • c++的文件读写
    #define_CRT_SECURE_NO_WARNINGS#include<iostream>#include<stdexcept>#include<algorithm>//1引入头文件#include<fstream>#include<string>//把磁盘信息输入到缓冲区然后读到程序中(读文件)voidtest02(){std::ifstreamifs;ifs.open("t......
  • C++U5-第01课-深度优先搜索1
    在全排列问题中,使用深度优先搜索(DFS)的思想体现在以下几个方面:递归结构:在解决全排列问题的函数中,我们使用了递归调用的方式。通过递归地处理每个位置上的数字,然后继续递归地处理下一个位置上的数字,最终得到完整的排列结果。选择与回溯:在每次递归调用中,我们需要做出选择并标记......
  • C++基础 -20- 基类覆盖父类
    ———————基类覆盖父类——————— ......
  • 并发重要知识点—线程池详解
    https://blog.csdn.net/qq_40270751/article/details/78843226 创建线程的另一种方法是实现Runnable接口。Runnable接口中只有一个run()方法,它非Thread类子类的类提供的一种激活方式。一个类实现Runnable接口后,并不代表该类是一个“线程”类,不能直接运行,必须通过Thread实例才......
  • 用C/C++(Win32API)写软件修改键位
    title:用C/C++(Win32API)写软件修改键位date:2021-06-25categories:编程tags:-键盘-注册表-C/C++-Windows前言紧接上篇《Windows用注册表修改键盘映射(扫描码)》,用起来会发现处处不协调,除了需要熟悉新键位以外,最重要的是原本的快捷键也被拆散了,如原本都在左下角的Ct......
  • C#与C++代码的互操作方式
    title:C#与C++代码的互操作方式date:2024-01-10categories:编程tags:-C#-.NET-C++-COM-平台调用大致介绍在写C#程序时经常有与本地代码(C/C++)代码交互的需求。微软提供了许多种方式供我们选择,最常用的有以下三种(A->B指A可以引用B):flowchartLRA--P/Invoke......
  • 知识点汇总
    1.类名重复了:项目和子模块中存在类名相同的java类,启动项目的时候会报错。Causedby:org.springframework.context.annotation.ConflictingBeanDefinitionException:Annotation-specifiedbeanname'MyPurchaseService'forbeanclass[com.mytest.service.impl.MyPurchaseServ......
  • C++U6-02-最短路算法1-dijkstra迪杰斯特拉最短路径
    学习目标 最短路径的基本概念  练习1 最短路的定义 本节课迪杰斯特拉dijkstra最短路算法 算法流程:以下是Dijkstra最短路径算法的逐步计算松弛的过程:初始化起始节点的距离为0,其他节点的距离为无穷大。选择当前距离最小且未被访问的节点作为当前节点。......
  • 为什么C++ 单例局部static初始化是线程安全的?
    为什么C++单例局部static初始化是线程安全的?constbg::AppSettings&bg::AppSettings::GetInstance(){staticAppSettingsinstance;returninstance;}对于以上单例模式代码,在C++11(及更高版本)中,函数局部静态AppSettings的构造保证是线程安全的。编译器将在AppS......