2010-08-13 15 views
5

Ma question est en référence à this question qui explique comment les fonctions virtuelles fonctionnent en cas de fonction virtuelle découpage d'objets qui finissent par appeler la classe de base et Wikipedia article ce qui explique la mise en page de table virtuelle pour une classe dérivée pour sous le codefonctions virtuelles objet Slicing

Au-dessus des sorties de programme "In A :: func".
class A{ 

    public: 
    virtual void func(){ cout<<"\n In A:func";} 
    }; 

    class B:public A{ 

    public: 
    virtual void func(){ cout<<"\n In B:func";} 
    }; 

    main(){ 
    A *ptr1 = new B(); 

    A oA = *ptr1; 

    oA.func(); 
    } 




     DerviedClassObjectB: 
     +0: pointer to virtual method table of B 

     virtual method table of B: 
     +0: B::func 

Mais comment sans table virtuelle pour la classe B connaître à propos de la classe de base A :: func finit par appeler A :: func

Répondre

13

"table virtuelle pour la classe B"? La table virtuelle pour la classe B n'est pas impliquée dans l'appel oA.func() du tout. L'objet oA a le type A, ce qui signifie que sa table virtuelle est celle de la classe A.

De plus, la plupart des compilateurs optimiseront l'appel oA.func() afin qu'il n'utilise aucune table virtuelle. Puisque le type de oA est connu au moment de la compilation, l'appel oA.func() peut être immédiatement dirigé vers A::func sans utiliser de tables virtuelles. Cela permet de copier toutes les variables membres dans un nouvel objet. A

11
A oA = *ptr1; 

Le pointeur vtable n'est pas une variable membre normale et est copié pas. Ainsi, toutes les fonctions virtuelles suivantes appelées contre cet objet agiront comme s'il s'agissait d'un objet A, car est un objet A.