RTTI及多态的实现机制

原创 2004年08月24日 13:25:00

                           C++ RTTI及多态的实现机制

 

RTTI中无论是dynamic_cast还是typeid,都是只对引用和指针有效。

 

 

假设实现多态的继承体系:

class Base

{

    public:

    virtual void Fun() ;

}

class Derived ;

Base* pp = new Derived() ;

Derived* pp2 = dynamic_cast< Derived*>(pp) ;

pp->Fun() ;

delete pp ;

 

先看看RTTI 如何实现:Derived* pp2 = dynamic_cast< Derived*>(pp) ;

当执行此语句时,首先找到pp指向的内存,取出此内存中头四个字节的内容,它即是vptr的值,然后找到vptr指向的内存,此处存放的是vtbl,而vtbl的第一个元素就是关于pp所指向实体的类型信息(可以通过此信息来解释pp指向的内存的内容)。到此,就可以决定dynamic_cast< Derived*>(pp)是返回NULL,还是转换成功。

 

在看多态调用实现: pp->Fun() ;

Fun函数指针在vtbl中的位置是在编译期就确定了的,因为Base类的各虚函数声明后,其vbtl的内容和格式就基本确定了。

原理同上差不多。首先找到pp指向的内存,取出此内存中头四个字节的内容,它即是vptr的值,然后找到vptr指向的内存,此处存放的是vtbl,而vtbl的第二个元素即vptr[1]就是所需要调用的函数的函数指针。

 

注意:

(1)       各个类的vtbl是在编译期就安排好了的,只是直到运行期才知道某个vbtl占用的内存地址。

(2)       各个vtbl中的函数指针指向的函数是在编译期确定的,但是函数指针的值是在运行期确定的,因为只有到运行期,才会知道函数的代码在内存空间中存放的地址。也可以将各个函数当作一个singleton类来理解。

(3)       vptr是由编译器插入到class定义中的,一般作为类的第一个成员。

(4)       vptr是在构造函数中被初始化的(这条代码也是编译器加上去了),所以vptr的值是在运行期确定的。可以这样理解:vptr = vtbl.createInstance() ;vtbl实际上是一个singleton类。即一个类对应一个vtbl,改类的所有对象都使用同一个vtbl。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhuweisky/article/details/83251

BCB中的RTTI机制

BCB中的RTTI机制RTTI在BCB中其实有两个意义。首先,针对一般标准的C++中所定义的,RTTI是所谓的Run-Time Type Identification的缩写。传统的程序语言中,所谓的数...
  • aniven
  • aniven
  • 2006年05月24日 17:09
  • 2987

从RTTI谈C++的向下转型

1.什么是RTTI? RTTI 是“Runtime Type Information”的缩写,意思是:运行时类型信息。它提供了运行时确定对象类型的方法。允许“用指向基类的指针或引用来操纵对象”的程...
  • tkp2014
  • tkp2014
  • 2015年10月03日 22:54
  • 273

C++中的RTTI(转)

RTTI 是“Runtime Type Information”的缩写,意思是:运行时类型信息。它提供了运行时确定对象类型的方法。本文将简略介绍 RTTI 的一些背景知识、描述 RTTI 的概念,并通...
  • mannhello
  • mannhello
  • 2010年01月20日 17:28
  • 19608

【C/C++学习】之十四、RTTI

RTTI(Runtime TypeIdentification) 提供了运行时确定对象类型及转换指针或引用类型的方法。  有关内容包括类名称,数据成员名称与类型,函数名与类型等。 在大多数面向度地...
  • Jofranks
  • Jofranks
  • 2012年10月14日 19:23
  • 1802

C++中的RTTI

RTTI Run-Time Type IdentificationRTTI也叫作运行时类型识别。 使用RTTI时需要include< typeinfo>实例:class Fly { public: ...
  • qq_23225317
  • qq_23225317
  • 2016年10月15日 18:49
  • 111

Nebula3 RTTI 小技巧

注意: 以下代码省略了命名空间前缀和”using namespace xxx”声明来改善可读性. 另外, 因为我没有通过编译器运行这些代码, 不保证有些手误. 不要把Rtti跟RTTI搞混:Rtti ...
  • xoyojank
  • xoyojank
  • 2009年06月16日 23:59
  • 2496

理解多态和RTTI

public class ChinesePerson implements Person { @Override public void say() { // TODO Auto-gener...
  • asdfsadfasdfsa
  • asdfsadfasdfsa
  • 2017年07月30日 10:26
  • 236

C++学习之多态篇(运行时类型识别--RTTI(typeid和dynamic_cast))

1.使用方式: dynamic_cast的使用说明: (1)只能有用于指针和引用的转换,将父类指针或引用转换为子类指针和引用 (2)要转换的类型中必须包含虚函数 (3)如果转换成功,返回的就是子...
  • hudfang
  • hudfang
  • 2016年02月03日 14:33
  • 969

JAVA的一些常识(绑定,多态,反射,RTTI)

多态何为多态?嗯就是多种状态,如果前面要加上代词的话,我想应该是对象。java多态可以分为三种,即重写多态、重载多态、泛型多态(通常意义上的多态指的是重写多态)。 重写多态:子类可以将父类的任意虚方...
  • nvnnv
  • nvnnv
  • 2016年03月28日 18:37
  • 763
收藏助手
不良信息举报
您举报文章:RTTI及多态的实现机制
举报原因:
原因补充:

(最多只允许输入30个字)