C++ - RTTI(RunTime Type Information)运行时类型信息 详解
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).
---------------------
作者:SpikeKing
来源:CSDN
原文:https://blog.csdn.net/caroline_wendy/article/details/24369987
版权声明:本文为博主原创文章,转载请附上博文链接!
C++ - RTTI(RunTime Type Information)运行时类型信息 详解相关推荐
- wxWidgets:运行时类型信息 (RTTI)
wxWidgets:运行时类型信息 (RTTI) wxWidgets:运行时类型信息 (RTTI) 类信息 RTTI例子 wxWidgets:运行时类型信息 (RTTI) C++ 的一个缺点曾经是没有 ...
- [面试] C/C++ 语法(六)—— RTTI(运行时类型信息)
RTTI(RunTime Type Information),顾名思义,对象运行时类型信息,以便在运行时进行类型识别. C++ 的对象识别可通过以下三个技术得以实现: (1)dynamic_cast ...
- C++-运行时类型信息,异常(day11)
一.运行时类型信息 1.typeid运算符 头文件:#include<typeinfo> C++的标准头文件,都对应相应的类 //sizeof(类型/变量/表达式),返回内存大小 type ...
- WCF服务端运行时架构体系详解[下篇]
作为WCF中一个核心概念,终结点在不同的语境中实际上指代不同的对象.站在服务描述的角度,我们所说的终结点实际上是指ServiceEndpoint对象.如果站在WCF服务端运行时框架来说,终结点实际上指 ...
- Java JVM内存模型(运行时数据区域)详解
详细介绍了JVM运行时数据区域,包括方法区.堆空间.栈空间.本地方法栈.程序计数器.常量池.直接内存.字面量.符号引用.直接引用. Java程序在运行时,需要在内存中的分配空间.为了提高运算效率,ja ...
- C++运行时类型信息 (RTTI)
dynamic_cast 用于多态类型的转换 typeid typeid 运算符允许在运行时确定对象的类型 type_id 返回一个 type_info 对象的引用 如果想通过基类的指针获得派生类的数 ...
- JVM——内存区域:运行时数据区域详解
关注微信公众号:CodingTechWork,一起学习进步. 引言 我们经常会被问到一个问题是Java和C++有何区别?我们除了能回答一个是面向对象.一个是面向过程编程以外,我们还会从底层内存管理 ...
- jvm中方法区和常量池详解_JVM——内存区域:运行时数据区域详解
关注微信公众号:CodingTechWork,一起学习进步. 引言 我们经常会被问到一个问题是Java和C++有何区别?我们除了能回答一个是面向对象.一个是面向过程编程以外,我们还会从底层内存管理和垃 ...
- JVM 运行时数据区详解,写得非常好!
作者:小小木的博客 www.cnblogs.com/wyc1994666/p/11795781.html 在接下来的几天想总结下,JVM相关的一些内容,比如下面的这三个内容算是比较核心知识点了 1.运 ...
最新文章
- javaSE基础知识 1.5整数类型
- 我的机器学习入门清单及路线!
- 摘之知乎网友...PHYTIN学习
- cordic ip核 vivado_Xilinx Vivado CORDIC IP求解atan 反正切
- 第四章语法分析和语法分析程序
- 从0开始实现自动化运维工具(一)
- ofo启示 | 创业企业为何大多熬不过五年?
- ERP原理与应用期末复习
- MICRO USB引脚定义以及接法
- keepalived 健康检查机制说明
- 如何在html中加入背景,html中如何加入背景图片
- py语言和php,php和python什么区别
- 每日一练||用Java图形界面实现加减乘除功能的计算器
- 学java难不难?java应该怎么学?
- 国产六大CPU厂商,近两年进展如何?
- 华硕主板+ubuntu18.04+3090驱动安装踩坑记录
- MPC多旋翼控制 - 线性MPC代码解读(mav_control_rw项目)
- 2020年中国智能物联网(AIoT)白皮书
- 提供一站式AI口语评测能力,声网AI互动课堂全新升级
- 安卓自定义下拉列表样式_自定义下拉列表样式
热门文章
- 跟着 Github 学习 Restful HTTP API 的优雅设计
- 对一些架构设计原则的反思
- 【手写系列】纯手写实现一个高可用的RPC
- Consul 入门指南
- 一起来造一个RxJava,揭秘RxJava的实现原理
- 荣耀鸿蒙os2.0报名入口,华为鸿蒙系统2.0在哪报名
- java 验证码 源码_java 验证码生成源码
- UPS电池异常故障案例
- 风口再起:数据中心建设
- CV之FR(H+k机器学习):基于每人几张人脸图片训练H+k模型实现(国内外明星)新人脸图像的姓名预测(准确度高达100%)