派生类的虚拟函数表在虚拟函数改写后,指针是如何变为改写后的函数指针的?
请教!!!

解决方案 »

  1.   

    虚拟函数表VTABLE。C++的虚拟函数机制,使用复杂。
      

  2.   

    编译器做的事~
    不太需要你来管它~
    如果你預期衍生類別有可能重新定義某一個成員函式,那麼你就在基礎類別中把此函式設為virtual。擁有純虛擬函式者為抽象類別(abstract Class),以別於所謂的具象類別(concrete class)。纯虚函数就是函数被赋予值0的虚函数。为了达到动态链接(后期链接)的目的,C++编译器通过某种表格,在执行时起[间接]呼叫实际上欲链接的函数(注意[间接]这个字眼)。这样的表格成为虚函数表(常被称为vtable)。每一个[内含虚函数的类],编译器都会为它做出一个虚函数表,表中的每一个元素都指向一个虚拟函数的地址。此外,编译器当然也会为类加上一项成员变量,是一个指向该虚函数表的指针(常被称为vptr)。
    class Class1 
    {
    public :
    data1;
    data2;
    memfunc();
    virtual vfunc1();
    virtual vfunc2();
    virtual vfunc3();
    };
    Class1 物件實體在記憶體中佔據這樣的空間:
    -------------------------------------------------------------------------------------------------
    |Class1 物件實體                |            vtable                                             |
    |-------------------------------|---------------------------------------------------------------|  
    |class Class1         | |
    |{ | |
    |public : | |
    | m_data1; | |
    | m_data2; |       vptr    ------- (*vfunc1)() ----- Class1::vfunc1() |
    | memfunc();         |       m_data1 ------- (*vfunc2)() ----- Class1::vfunc2() |
    | virtual vfunc1(); |       m_data2 ------- (*vfunc3)() ----- Class1::vfunc3() |
    | virtual vfunc2(); |                             |
    | virtual vfunc3(); |                                         Class1::memfunc() |
    |} | |
    -------------------------------------------------------------------------------------------------
    奥妙在于这种虚函数表以及这种间接呼叫方式。虚函数表的内容是依据类中的虚函数声明次序,一一填入函数指针。派生类会继承基类的虚函数表(以及所有其它可以继承的成员),当我们自派生类中改写虚函数时,虚函数表就受了影响:表中元素所指的函数位置将不再是基类的函数位置,而是派生类的函数位置。
    class Class2 : public Class1 
    {
    public :
    data3;
    memfunc();
    virtual vfunc2();
    };-------------------------------------------------------------------------------------------------
    |Class2 物件實體                |            vtable                                             |
    |-------------------------------|---------------------------------------------------------------|  
    |class Class2         | |
    |{ | |
    |public : | |
    | m_data3; | |
    | memfunc(); |       vptr    ------- (*vfunc1)() ----- Class1::vfunc1() |
    | virtual vfunc2();       |       m_data1         (*vfunc2)() ----- Class2::vfunc2() |
    |} |       m_data2         (*vfunc3)() ----- Class1::vfunc3() |
    | |       m_data3                 |
    | |                                         Class2::memfunc() |
    | | |
    -------------------------------------------------------------------------------------------------
    於是,一個「指向Class1 所生物件」的指针,所呼叫的vfunc2 就是Class1::vfunc2,而一個「指向Class2 所生物件」的指针,所呼叫的vfunc2 就是Class2::vfunc2。
    深入浅出MFC中如是说~
      

  3.   

    to jiangping_zhu(娜可露露之风之刃) 
    你可以把代码发给我看看么?
      

  4.   

    to rivershan(笨猫)
    我想知道其中的机制,你能给我解释一下么?