ivy-jie

progress ...

C++博客 首页 新随笔 联系 聚合 管理
  9 Posts :: 41 Stories :: 6 Comments :: 0 Trackbacks
    C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。
1 虚函数表
    虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。 在这个表中,主是要一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其容真实反应实际的函数。这样,在有虚函数的类的实例中这个表被分配在了 这个实例的内存中,所以,当我们用父类的指针来操作一个子类的时候,这张虚函数表就显得由为重要了,它就像一个地图一样,指明了实际所应该调用的函数。

    这里我们着重看一下这张虚函数表。在C++的标准规格说明书中说到,编译器必需要保证虚函数表的指针存在于对象实例中最前面的位置(这是为了保证正确取到虚函数的偏移量)。 这意味着我们通过对象实例的地址得到这张虚函数表,然后就可以遍历其中函数指针,并调用相应的函数。

2 代码:
#include <stdio.h>
#include <iostream.h>
#include <stdlib.h>
typedef void (*Fun) (void);
class Base{
public:
 virtual void f() {cout<<"Base::f"<<endl;}
 virtual void g() {cout<<"Base::g"<<endl;}
 virtual void h() {cout<<"Base::h"<<endl;}
};
void main(int argc,char * argv[])
{
  Base b;
  Fun pFun = NULL;
  int *var1= (int *)&b;
  cout<<"虚函数表地址:"<<var1<<endl; //(int*)(&b)
  int *var2 = (int*)*(int*)(&b);
  cout<<"虚函数表-第一个函数地址:"<< var2 << endl;//(int*)*(int*)(&b)
  //Invoke the first virtual function
  pFun = (Fun)*((int*)*(int*)(&b)+0); //f()
  pFun();
  pFun = (Fun)*((int*)*(int*)(&b)+1); //g()
  pFun();
  pFun = (Fun)*((int*)*(int*)(&b)+2); // h()
  pFun();
}
//结果
虚函数表地址:0x0012FF7C
虚函数表-第一个函数地址:0x0042804C
Base::f
Base::g
Base::h
posted on 2009-05-18 09:26 ivy-jie 阅读(167) 评论(0)  编辑 收藏 引用 所属分类: c++

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理