C++学习笔记(十七):RTTI

这个知识点被遗漏了,可以结合之前的这篇文章看类型转换这个知识点。

RTTI(Run-Time Type Information,运行时类型信息)即程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型。

C++中有两个操作符提供RTTI
typeid:返回指针或引用所指对象的实际类型。
dynamic_cast:将基类类型的指针或引用安全地转换为派生类型的指针和引用。(点击这里查看

typeid
头文件:# include<typeinfo>
语法--两种形式:typeid (type) 、typeid (expression)即任意表达式或类型名。
常见的用途:比较两个表达式的类型,或者将表达式的类型与特定类型相比较。
typeid返回类型:const type_info&;

具体定义如下:

 1 class type_info{
 2 public:
 3     virtul ~type_info();
 4     bool operator == (const type_info&rhs)const;
 5     bool operator != (const type_info&rhs)const;
 6     bool before(const type_info&rhs)const;
 7     const char* name()const;
 8 private:
 9     type_info(const type_info& rhs);
10     type_info& operator=(const type_info& rhs);
11 }  

接口说明:

operator ==和operator!=:比较操作符,返回两个类型是否为(或不为)同一类型(注:基类和派生类不为同一类型!)。
before:若在类型排序中,该类型先于rhs的类型则返回true。
name:返回类型对应的名字(具体所用的值,依赖于具体编译器)(以\0结束的字符串)。
注意:type_info类的默认构造函数和复制构造函数以及赋值操作符都定义为private,故不能定义或复制type_info类型的对象。程序中创建type_info对象的唯一方法是使用typeid操作符。

示例:

 1 #include <iostream>
 2 #include <typeinfo>
 3 using namespace std;
 4
 5 struct Base {};
 6 struct Derived : Base {};
 7 struct Poly_Base {virtual void Member(){}};
 8 struct Poly_Derived: Poly_Base {};
 9
10 int main() {
11
12   int a;
13   int * pa;
14   cout << "int is: " << typeid(int).name() << endl;
15   cout << "  a is: " << typeid(a).name() << endl;
16   cout << " pa is: " << typeid(pa).name() << endl;
17   cout << "*pa is: " << typeid(*pa).name() << endl << endl;
18
19
20   Derived derived;
21   Base* pbase = &derived;
22   cout << "derived is: " << typeid(derived).name() << endl;
23   cout << "*pbase is: " << typeid(*pbase).name() << endl;
24   cout << "same type? ";
25   cout << ( typeid(derived)==typeid(*pbase) ) << endl << endl;
26
27
28   Poly_Derived polyderived;
29   Poly_Base* ppolybase = &polyderived;
30   cout << "polyderived is: " << typeid(polyderived).name() << endl;
31   cout << "*ppolybase is: " << typeid(*ppolybase).name() << endl;
32   cout << "same type? ";
33   cout << ( typeid(polyderived)==typeid(*ppolybase) ) << endl << endl;
34   return 0;
35 }  
时间: 2024-08-11 06:15:25

C++学习笔记(十七):RTTI的相关文章

angular学习笔记(十七)-路由和切换视图

本篇介绍angular中如何通过判断url的hash值来显示不同的视图模板,并使用不同的控制器: 下面,通过一个例子,来一步一步说明它的用法: 我们要做一个邮箱应用,打开的时候显示的是邮件列表: 然后点击邮件主题,可以查看该邮件的详细内容: 点击返回列表,再回到列表页 一. 创建index页面: <!DOCTYPE html> <html> <head> <title>14.1路由和视图切换</title> <meta charset=&q

[傅里叶变换及其应用学习笔记] 十七. Ш函数

Ш函数的三个性质 上节课我们学习了$Ш_p$函数,其定义如下 $Ш_p = \displaystyle{ \sum_{k=-\infty}^{\infty}\delta(x-kp) }$     $Ш_p$函数有以下三个性质, 1) 采样性质,继承了$\delta$函数的采样性质 $f(x)Ш_p(x) = \displaystyle{ \sum_{k=-\infty}^{\infty}f(kp)\delta(x-kp) }$ 2) 周期性质,继承了$\delta$函数的移位性质 $(f*Ш_p

SharpGL学习笔记(十七) 立体文字和平面文字

在写有关文字的主题前,笔者翻阅了几本书上的相关章节,研究了几天无果. 徐明亮<OpenGL游戏编程>书中介绍的是“位图字体”,也就是把字体栅格化,然后画出来.照着书上的VC代码翻译为C#的,突然卡在一个windows API,  wglUseFontBitmpas()上面了,这个函数要传入一个DC,惨了,不知道怎么搞了. 另一本书上文字相关的章节介绍的类似于画贴图方式,载入文字纹理图片,由于它的代码使用了一个游戏框架,照成我需要研究整个框架是怎么运作的,试了一下还不太容易理解,就这样两天工夫就

PHP学习笔记十七【面向对象定义类】

<?php class Person{ public $name; public $age; public function speak(){ echo "Hello world"; } //判断最大的数 public function findMax($arr) { //从数组中找最大的数 //1.假设数组的第一个数就是最大的数 $maxVal=$arr[0]; //2.计算最大数的下标 for($i=1;$i<count($arr);$i++) { if($maxVal

JavaScript权威设计--事件处理介绍(简要学习笔记十七)

1.事件相关概念 事件类型:一个用来说明发生什么类型事件的字符串 事件目标:是发生的事件或与之相关的对象. 事件处理程序(事件监听程序):是处理货响应事件的函数. 事件对象:是与特定事件相关并且包含有关该事件详细信息的对象. 事件传播:是浏览器决定哪个对象触发其事件处理程序的过程. 事件捕获:在容器元素上注册的特定处理程序有机会再事件传播打破真实目标之前拦截它. 阻止标签默认事件的发生 2.Window事件 focus,blur不冒泡.focusin,focusout冒泡. load当文档和其他

Android学习笔记十七.Android数据存储与IO.File存储常用API

Android通过一套完整的I/O流体系,包括FileInputStream.FileOutputStream等,通过这些I/O流来访问手机存储上的文件. 一.API 1.File (1)功能:该类提供一些有限的功能-获取或设置文件的权限.文件类型.最后依次修改时间等,通常它所代表的文件名(包含路径)将被转换为UTF-8字节序列被使用. (2)继承关系 java.lang.Object ? java.io.File (3)构造方法  File(File dir, String name):构造一

学习笔记 十七 : 时间 ntp 和chrony

一 ntp介绍 二 安装配置 三 案例

yii2源码学习笔记(十七)

Theme 类,应用的主题,通过替换路径实现主题的应用,方法为获取根路径和根链接:yii2\base\Theme.php 1 <?php 2 /** 3 * @link http://www.yiiframework.com/ 4 * @copyright Copyright (c) 2008 Yii Software LLC 5 * @license http://www.yiiframework.com/license/ 6 */ 7 8 namespace yii\base; 9 10 u

python学习笔记十七:base64编码

Python中进行Base64编码和解码要用base64模块,代码示例: #-*- coding: utf-8 -*- import base64 str = 'cnblogs' str64 = base64.b64encode(str) print str64 #Y25ibG9ncw== print base64.b64decode(str64) #cnblogs

Java基础学习笔记十七 集合框架(三)之Map

Map接口 通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同,如下图. Collection中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储. Map中的集合,元素是成对存在的(理解为夫妻).每个元素由键与值两部分组成,通过键可以找对所对应的值. Collection中的集合称为单列集合,Map中的集合称为双列集合. 需要注意的是,Map中的集合不能包含重复的键,值可以重复:每个键只能对应一个值. Map中