C++ - RTTI(RunTime Type Information)执行时类型信息 具体解释
RTTI(RunTime Type Information)执行时类型信息 具体解释
本文地址: http://blog.csdn.net/caroline_wendy/article/details/24369987
RTTI, RunTime Type Information, 执行时类型信息, 是多态的主要组成部分,
通过执行时(runtime)确定使用的类型, 执行不同的函数,复用(reuse)接口.
dynamic_cast<>能够 使基类指针转换为派生类的指针, 通过推断指针的类型, 能够决定使用的函数.
typeid(), 能够推断类型信息, 推断指针指向位置, 在多态中, 能够推断基类还是派生类.
代码:
/*
* test.cpp
*
* Created on: 2014.04.22
* Author: Spike
*/ /*eclipse cdt, gcc 4.8.1*/ #include <iostream>
#include <typeinfo> using namespace std; class Base {
public:
virtual void fcnA() {
std::cout << "base" << std::endl;
}
}; class Derived : public Base {
public:
virtual void fcnB() {
std::cout << "derived" << std::endl;
}
}; void fcnC(Base* p) {
Derived* dp = dynamic_cast<Derived*>(p);
if (dp != NULL)
dp->fcnB();
else
p->fcnA();
} void fcnD(Base* p) {
if (typeid(*p) == typeid(Derived)) {
Derived* dp = dynamic_cast<Derived*>(p);
dp->fcnB();
} else
p->fcnA();
} int main(void) {
Base* cp = new Derived;
std::cout << typeid(cp).name() << std::endl;
std::cout << typeid(*cp).name() << std::endl;
std::cout << typeid(&(*cp)).name() << std::endl;
fcnC(cp);
fcnD(cp);
Base* dp = new Base;
fcnC(dp);
fcnD(dp); return 0;
}
输出:
P4Base
7Derived
P4Base
derived
derived
base
base
以上代码仅仅是演示样例,
详细使用时, 避免使用dynamic_cast<>和typeid()去推断类型, 直接通过多态就可以.
注意多态的绑定仅仅能通过指针, 如fcnC(Base*), 或引用, 如fcnD(Base&), 实现动态绑定,
两者效果同样;
都会依据输入的类型,动态绑定虚函数(virtual function).
代码例如以下:
/*
* test.cpp
*
* Created on: 2014.04.22
* Author: Spike
*/ /*eclipse cdt, gcc 4.8.1*/ #include <iostream>
#include <typeinfo> using namespace std; class Base {
public:
virtual void fcn() {
std::cout << "base" << std::endl;
}
}; class Derived : public Base {
public:
virtual void fcn() override {
std::cout << "derived" << std::endl;
}
}; void fcnC(Base* p) {
p->fcn();
} void fcnD(Base& p) {
p.fcn();
} int main(void) {
Base* cp = new Derived;
std::cout << typeid(cp).name() << std::endl;
std::cout << typeid(*cp).name() << std::endl;
fcnC(cp);
fcnD(*cp);
Base* dp = new Base;
fcnC(dp);
fcnD(*dp); Base& cr = *cp;
std::cout << typeid(&cr).name() << std::endl;
std::cout << typeid(cr).name() << std::endl;
fcnC(&cr);
fcnD(cr);
Base& dr = *dp;
fcnC(&dr);
fcnD(dr); return 0;
}
输出:
P4Base
7Derived
derived
derived
base
base
P4Base
7Derived
derived
derived
base
base
C++ - RTTI(RunTime Type Information)执行时类型信息 具体解释的更多相关文章
- RTTI (Run-time type information) in C++
In C++, RTTI (Run-time type information) is available only for the classes which have at least one v ...
- c++对象模型和RTTI(runtime type information)
在前面已经探讨过了虚继承对类的大小的影响,这次来加上虚函数和虚继承对类的大小的影响. 先来回顾一下之前例子的代码: #include <iostream> using namespace ...
- RTTI(Runtime Type Information )
RTTI 是“Runtime Type Information”的缩写,意思是:运行时类型信息.它提供了运行时确定对象类型的方法.本文将简略介绍 RTTI 的一些背景知识.描述 RTTI 的概念,并通 ...
- c++ RTTI(runtime type info)
RTTI(Run-Time Type Information,通过运行时类型信息)程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型. RTTI提供了以下两个非常有用的操作符: ...
- Dynamic type checking and runtime type information
动态类型的关键是将动态对象与实际类型信息绑定. See also: Dynamic programming language and Interpreted language Dynamic type ...
- 【JavaSE】运行时类型信息(RTTI、反射)
运行时类型信息使得你可以在程序运行时发现和使用类型信息.--<Think in java 4th> **** 通常我们在面向对象的程序设计中我们经常使用多态特性使得大部分代码尽可能地少了解 ...
- 是否含有RTTI(运行时类型信息)是动态语言与静态语言的主要区别
运行时类型信息代表类型信息和对内存的操作能力. 运行时类型信息是运行时系统的基础. 类型信息分为编译时类型信息和运行时类型信息两种: 静态语言的类型信息只在编译时使用和保留,在可执行文件中没有类型信息 ...
- 了解运行时类型信息(RTTI)
RTTI需要引用单元TypeInfo GetPropInfo 函数用于获得属性的 RTTI 指针 PPropInfo.它有四种重载形式,后面三种重载的实现都是调用第一种形式.AKinds 参数用于限制 ...
- RTTI (Run-Time Type Identification,通过运行时类型识别) 转
参考一: RTTI(Run-Time Type Identification,通过运行时类型识别)程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型. RTTI提供了以下两个 ...
随机推荐
- 15数据库与ADO.Net
数据库与ADO.Net 数据库与ADO.Net 8.1 数据库基本概念 数据库提供了一种将信息集合在一起的方法.数据库应用系统主要由三部分组成:数据库管理系统(DBMS),是针对所有应用的,例如A ...
- 04Struts2的配置文件
Struts2的配置文件 1.1 struts.xml中的标签详解 1.1.1 constant标签 作用: 用于修改struts2中的常量 属性: name:指定常量的key value:指 ...
- vue开发调试工具vue-devtools安装
vue开发调试工具别人总结的非常好,所以直接把链接拿过来了,就当做个笔记了,也希望能帮到有需要的人,感谢“沉着前进”,来源(https://www.cnblogs.com/fighxp/p/78150 ...
- Linux系统用户、组和权限管理
一.用户与组 1.用户与组的概念 在linux系统中,根据系统管理需要将用户分为三种类型: 1.超级用户:root是linux系统的超级用户,对系统拥有绝对权限.由于root用户权限太大,只有在进行系 ...
- token 的生成杂谈
背景 很多时候我们需要用 token 来作为一些标识, 比如: 一个用户登录后的认证标识. 实现方式 md5 的方式: $v = 1; // 自己定义的 需要hash 的value 值 $key = ...
- C#DateTimeFormatInfo类
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAzAAAACdCAIAAADkAArhAAAgAElEQVR4nO1dWXbjug7UzrI0LS1L0/ ...
- PHP:GD库 图片水印处理
文章来源:http://www.cnblogs.com/hello-tl/p/7592974.html <?php /** * 处理图片类 * 1.添加文字水印 * 2.添加图片水印 * 3.压 ...
- Hdu 5274 Dylans loves tree (树链剖分模板)
Hdu 5274 Dylans loves tree (树链剖分模板) 题目传送门 #include <queue> #include <cmath> #include < ...
- 7-9 旅游规划(25 分)(Dijkstra最短路径算法)
有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路费.现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径.如果有若干条路径都是最短的,那么需要输出最便 ...
- JS前端取得并解析后台服务器返回的JSON数据的方法
摘要:主要介绍:使用eval函数解析JSON数据:$.getJSON()方法获得服务器返回的JSON数据 JavaScript eval() 函数 eval(string) 函数可计算某个字符串,并执 ...