虚函数
  C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。
  什么是虚函数?
  在一个类里 一个类成员函数前加一个virtual关键字 ,并在派生类中重新定义的成员函数,可实现成员函数的动态重载.是一个虚函数,
  但是虚函数也有两种
  1 普通虚函数
  class Test
  {
  public:
  virtual add(int,int); //普通的虚函数
  }
  2 纯虚函数
  class Test
  {
  public:
  virtual add(int,int)=0 //纯虚函数
  }
  普通的虚函数: 函数体里面有函数实现部分,但到派生类里可以重载也可以不重载
  纯虚函数:函数体里面没有函数实现部分,必须在派生类里重载,所以直接等于0,函有纯虚函数的类,我们叫做抽像类,抽象类不可以实例化对象,如果实例化编绎器会报错的
  虚函数的意义?
  可以让成员函数操作一般化,用基类的指针指向不同的派生类的对象时, 基类指针调用其虚成员函数,则会调用其真正指向对象的成员函数,而不是基类中定义的成员函数(只要派生类改写了该成员函数)。
  若不是虚函数,则不管基类指针指向的哪个派生类对象,调用时都
  会调用基类中定义的那个函数。
  什么是虚函数表?
  对C++ 了解的人都应该知道虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。在这个表中,主是要一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其容真实反应实际的函数。这样,在有虚函数的类的实例中这个表被分配在了这个实例的内存中,所以,当我们用父类的指针来操作一个子类的时候,这张虚函数表显得由为重要了,它像一个地图一样,指明了实际所应该调用的函数。
  这里我们着重看一下这张虚函数表。C++的编译器应该是保证虚函数表的指针存在于对象实例中前面的位置(这是为了保证取到虚函数表的有高的性能——如果有多层继承或是多重继承的情况下)。这意味着我们通过对象实例的地址得到这张虚函数表,然后可以遍历其中函数指针,并调用相应的函数。
  听我扯了那么多,我可以感觉出来你现在可能比以前更加晕头转向了。没关系,下面是实际的例子,相信聪明的你一看明白了。
  假设我们有这样的一个类:
  classBase {
  public:
  virtualvoid f() { cout << "Base::f"<< endl; }
  virtualvoid g() { cout << "Base::g"<< endl; }
  virtualvoid h() { cout << "Base::h"<< endl; }
  };
  按照上面的说法,我们可以通过Base的实例来得到虚函数表。下面是实际例程:
  typedefvoid(*Fun)(void);
  Base b;
  Fun pFun = NULL;
  cout << "虚函数表地址:" << (int*)(&b) << endl;
  cout << "虚函数表 — 第一个函数地址:" << (int*)*(int*)(&b) << endl;
  // Invoke the first virtual function
  pFun = (Fun)*((int*)*(int*)(&b));
  pFun();
  实际运行经果如下:(WindowsXP+VS2003, Linux 2.6.22 + GCC 4.1.3)
  虚函数表地址:0012FED4
  虚函数表 — 第一个函数地址:0044F148
  Base::f