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。

版权声明:本文为博主原创文章,未经博主允许不得转载。

C#中RTTI控制的例子

using System.Reflection; private object GetProperty(objectAObject, string APrope...
  • i53nd
  • i53nd
  • 2009年01月05日 22:49
  • 425

java中实现多态的机制是什么?

面向对象编程有三大特性:封装、继承、多态。 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据。对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法。 ...
  • BornLiLi
  • BornLiLi
  • 2017年02月15日 18:31
  • 8318

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

多态何为多态?嗯就是多种状态,如果前面要加上代词的话,我想应该是对象。java多态可以分为三种,即重写多态、重载多态、泛型多态(通常意义上的多态指的是重写多态)。 重写多态:子类可以将父类的任意虚方...
  • nvnnv
  • nvnnv
  • 2016年03月28日 18:37
  • 652

理解多态和RTTI

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

RTTI机制与作用

一、RTTI(Run-Time Type identification),通过运行时类型信息,程序能够使用基类的指针或引用来检查这些指针或引用所指向的对象的实际派生类型。面向对象的编程语言,想C++,...
  • gogoky
  • gogoky
  • 2016年05月04日 21:15
  • 2189

浅谈多态机制的意义及实现

标题:浅谈多态机制的意义及实现 作者:舒の随想日记在面向对象编程(Object-Oriented Programming, OOP)中,多态机制无疑是其最具特色的功能,甚至可以说,不运用多态的编程不...
  • u011116672
  • u011116672
  • 2015年12月29日 18:57
  • 1361

C++中的RTTI机制解析

RTTI概念 RTTI(Run Time Type Identification)即通过运行时类型识别,程序能够使用基类的指针或引用来检查着这些指针或引用所指的对象的实际派生类型。 RTTI机制的...
  • three_bird
  • three_bird
  • 2016年05月23日 09:31
  • 5682

java中提供了哪两种多态的机制

java中提供了哪两种多态的机制 编译时多态和运行时多态。编译时多态是通过方法的重载实现的,运行时多态是通过方法的覆盖(子类覆盖父类方法)实现的。 注:函数不能以返回值来区分的,虽然两个函数有着不同...
  • yun18256076755
  • yun18256076755
  • 2015年01月21日 15:16
  • 3202

IOS - 运行时 (多态)

IOS运行时介绍,包括类对象、id类型等。
  • Crazy__Programmer
  • Crazy__Programmer
  • 2014年04月22日 08:09
  • 5328

C++与Java中多态实现机制的区别

一种错误的观点是:c++与java多态性的实现机制不同,但它们的表现形式应该相同。以下我将举出两个例子(请耐心看)。class Super { public Super() { ...
  • Ludo_vic
  • Ludo_vic
  • 2017年12月03日 18:33
  • 61
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:RTTI及多态的实现机制
举报原因:
原因补充:

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