2010-08-13 23 views
5

La mia domanda è con riferimento a this question che spiega come virtuale funzioni operano in caso di affettamento oggetto che finiscono per chiamare classe di base funzione virtuale e Wikipedia article che spiega il layout di tabella virtuale per una classe derivata per il sottostante codicefunzioni virtuali oggetto affettare

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 

Sopra le uscite del programma "In A :: func".

Ma come fa a meno tabella virtuale per la classe B sapere su classe di base A :: func finisce per chiamare A :: func

risposta

13

"tavolo virtuale per la classe B"? La tabella virtuale per la classe B non è coinvolta nella chiamata oA.func(). L'oggetto oA ha il tipo A, il che significa che la sua tabella virtuale è quella della classe A.

Inoltre, la maggior parte dei compilatori ottimizzerà la chiamata oA.func() in modo che non utilizzi affatto tabelle virtuali. Poiché il tipo di oA è noto al momento della compilazione, la chiamata oA.func() può essere immediatamente indirizzata a A::func senza utilizzare alcuna tabella virtuale.

11
A oA = *ptr1; 

Copia tutte le variabili membro in un nuovo oggetto A. Il puntatore vtable non è una variabile membro normale ed è non copiato. Pertanto, qualsiasi funzione virtuale successiva chiamata contro questo oggetto agirà come se fosse un oggetto A, perché è un oggetto A.

Problemi correlati