我的Google Reader分享

Sunday, June 24, 2007

C++中的多态的底层机制

  面向对象程序设计语言的一个特性就是多态。在C++中,多态是由虚函数(virtual)来实现的。
  看下面的例子:
  基类:
  class Fuck {
    public:
Fuck();
     void action(){
      cout <<"Be fucked"<< endl
     };
  };

  派生类:
  class FuckYourMother : Fuck{
    public:
     FuckYourMother();
     void action(){
      cout << "Your mother's been fucked"<< endl
     };
  };

  int main()
  {
    Fuck *a = new FuckYourMother();
    a->action();

    return 0;
  }

  上面的程序并不会实现多态,程序的运行结果是:Be fucked
  如果要实现多态只要在需要的实现多态的那个函数前加关键字virtual。
  
  class Fuck {
    public:
Fuck();
     virtual void action(){
      cout <<"Be fucked"<< endl
     };
  };

  派生类:
  class FuckYourMother : Fuck{
    public:
FuckYourMother();
     void action(){
      cout << "Your mother's been fucked"<< endl
     };
  };

  int main()
  {
    Fuck *a = new FuckYourMother();
    a->action();

    return 0;
  }

  在底层,多态的实现是依靠一个叫VTABLE的东东的,每个类都会建立一个VTABLE,比如在上面的例子中,基类Fuck的VTABLE应该是如下形式:
  编号  函数地址
  1 Fuck()的函数地址
  2 void action()的地址

  FuckYourMother类的VTABLE应该是:(如果这个类中没有定义void action()函数)
  编号  函数地址   
  1     FuckYourMother()的地址
  2 这里会复制基类中void action()函数的地址。
  
  FuckYourMother类的VTABLE应该是:(如果这个类中自己定义了void action()函数)
  编号  函数地址   
  1     FuckYourMother()的地址
  2 这里会override基类中的void action()函数

No comments: