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

以上代码只是示例,

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/cplus/

具体使用时, 避免使用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

作者:csdn博客 Spike_King

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索指针
, 多态
, 运行
, 类型
, 信息
, 指针c++区别cp
, 判断详解
information
jpa cascadetype详解、setdataandtype详解、lockmodetype详解、type命令详解、type c接口详解,以便于您获取更多的相关知识。

时间: 2024-11-30 04:18:59

C++:RTTI(RunTime Type Information)运行时类型信息 详解的相关文章

WCF客户端运行时架构体系详解[上篇]

客户端调用WCF服务的方式不外乎有两种:其一.通过代码生成工具(比如SvcUtil.exe)导入服务的元数据生成服务代理相关的类型:其二.通过ChannelFactory<TChannel>创建服务代理对象.对于前者,生成的服务代理是一个继承自ClientBase<TChannel>的类型.对于这样一个服务代理对象,其内部本质上还是借助于ChannelFactory<TChannel>创建真正用于进行服务调用的代理对象.对于WCF客户端应用编程接口来说,ChannelF

WCF服务端运行时架构体系详解[下篇]

作为WCF中一个核心概念,终结点在不同的语境中实际上指代不同的对象.站在服务描述的角度,我们所说的终结点实际上是指ServiceEndpoint对象.如果站在WCF服务端运行时框架来说,终结点实际上指代的是终结点分发器(EndpointDispatcher).而ServiceEndpoint与EndpointDispatcher是一一匹配的,并且前者是创建后者的基础.而终结点分发器具有自己的运行,即分发运行时(DispatchRuntime). 目录 一.终结点分发器(EndpointDispa

WCF服务端运行时架构体系详解[上篇]

WCF的服务端架构体系又可以成为服务寄宿端架构体系.我们知道,对于一个基于某种类型的服务进行寄宿只需要使用到一个唯一的对象,那就是ServiceHost.甚至在某种语境下,我们所说的服务实际上就是指的对应的ServiceHost对象.整个服务寄宿过程包括两个阶段,即服务描述的创建和服务端运行框架的建立.而第一个阶段创建的服务描述是为了第二个阶段对服务端运行时框架建立服务的,所以我们有必要在对服务描述进行简单的介绍. 目录: 一.从服务描述(Service Description)谈起 二.服务端

WCF客户端运行时架构体系详解[下篇]

当基于某个终结点创建的ChannelFactory<TChannel>被开启的之后,位于服务模型层的客户端运行时框架被成功构建.站在编程的角度看ChannelFactory<TChannel>,它就是一个创建用于服务调用的服务代理对象的工厂.由于服务调用需要借助于服务代理来完成,我们很有必要从整个客户端运行架构层面来了解服务代理和基于服务代理的服务调用是如何实现的. 目录 一.服务代理是一个透明代理 二.服务调用的流程       操作选择       输入参数检验       序

WCF服务端运行时架构体系详解[续篇]

终结点分发器在自己的运行时中对请求消息的处理最终肯定体现在相应操作的执行.如果从服务描述的角度来看,操作是一个OperationDescription对象.而服务端分发运行时中的操作则代表的是一个DispatchOperation对象.作为服务描述的一部分,服务所有终结点的所有操作描述(OperationDescription)在ServiceHost创建过程中被创建.而当ServiceHost被正常开始时,这些操作描述最终转换成分发操作(DispatchOperation).而Dispatch

WCF服务端运行时架构体系详解[中篇]

在这篇文章中,我们对信道分发器本身作一个深入的了解,首先来看看它具有哪些可供扩展的组件,以及我们可以针对信道分发器对WCF实现哪些可能的扩展. 目录: ErrorHandler & ServiceThrottle ChannelInitializer IncludeExceptionDetailInFaults ManualAddressing MaxPendingReceives ReceiveSynchronously IsTransactedReceive & MaxTransact

ASP.NET HTTP运行时组成的详解

asp.net|详解 简介 不管使用哪种底层平台,可靠性和性能都是对所有 Web 应用程序的主要要求,尽管从某种意义上讲,这两个要求是相互矛盾的.例如,要构建更可靠.更健壮的应用程序,可能需要将 Web 服务器与具体的应用程序分离,使应用程序在进程外工作.但是,如果在不同于 Web 服务器进程的内存环境中工作,应用程序将变慢.因此,需要采取合理的措施,以确保进程外代码尽可能快地运行. 在构建 Microsoft? ASP.NET 运行时环境时,依据的设计原则即:充分考虑可靠性和性能.得到的 AS

java程序运行时内存分配详解_java

一. 基本概念    每运行一个java程序会产生一个java进程,每个java进程可能包含一个或者多个线程,每一个Java进程对应唯一一个JVM实例,每一个JVM实例唯一对应一个堆,每一个线程有一个自己私有的栈.进程所创建的所有类的实例(也就是对象)或数组(指的是数组的本身,不是引用)都放在堆中,并由该进程所有的线程共享.Java中分配堆内存是自动初始化的,即为一个对象分配内存的时候,会初始化这个对象中变量.虽然Java中所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在栈中分配,也

举例讲解Java的RTTI运行时类型识别机制_java

1.RTTI:运行时类型信息可以让你在程序运行时发现和使用类型信息. 在Java中运行时识别对象和类的信息有两种方式:传统的RTTI,以及反射.下面就来说下RTTI. RTTI:在运行时,识别一个对象的类型.但是这个类型在编译时必须已知. 下面通过一个例子来看下RTTI的使用.这里涉及到了多态的概念:让代码只操作基类的引用,而实际上调用具体的子类的方法,通常会创建一个具体的对象(Circle,Square,或者Triangle,见下例),把它向上转型为Shape(忽略了对象的具体类型),并在后面