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提供了以下两个 ...
随机推荐
- iis如何在dos中注册
iis如何在dos中注册 2009-09-23 08:13 提问者采纳 cd \cd c:\windows\microsoft.net\framework\v2.0.50727aspnet_r ...
- UTF-8,UTF-16
UTF是 Unicode Translation Format,即把Unicode转做某种格式的意思. 在Unicode基本多文种平面定义的字符(无论是拉丁字母.汉字或其他文字或符号),一律使用2字节 ...
- for in,Object.keys()与for of的用法与区别
Array.prototype.sayLength=function(){ console.log(this.length); } let arr = ['a','b','c','d']; arr.n ...
- vue全选与反选以及通过使用如何filter删除数据
在vue学习经常遇到的一些基本问题,下面是购物车里面的部分功能,分享给初学者,直接上源码: <!DOCTYPE html><html> <head> <met ...
- 懒癌晚期学图论的时候自己用C语言写了个求可达性矩阵的算法~
可达性矩阵算法~ 直接上代码 #include <iostream> #include <cstring> using namespace std; #define n 5 v ...
- group 和 gshadow
group组文件 位置:/etc/group 作用:存放用户的分组信息 使用 /etc/group 命令查看时,得到的数据如下: 分析上图,可以得到以下结果 第1个字段:组名 默认组名与用户名名称一样 ...
- Python中的列表(4)
1.遍历列表 如果想打印列表中的所有元素,则必须遍历列表. 可以使用for ... in ... 语句来遍历列表中的元素.遍历的意思 words = ['a','b','c','d'] for wor ...
- os系统安装Python虚拟环境virtualenv和virtualenvwrapper
一.安装Python 上节已经讲了如何安装Python2和Python3 二.给Python3安装virtualenv 在终端输入:sudo pip3 install virtualenv 等待安装成 ...
- spark streaming基于Kafka的开发
spark streaming使用Kafka数据源进行数据处理,本文侧重讲述实践使用. 一.基于receiver的方式 在使用receiver的时候,如果receiver和partition分配不当, ...
- 【转】Java的path,classpath,java_home环境变量的配置与具体含义
对于一个Java初学者来说,第一步要做的是安装jdk并配置环境变量,一般按照书上或者网上的步骤,一步步照着做就行了,但是对于初学者来说,很多问题没有解决,比如为什么很多配置方法各不相同,却都能够配置成 ...