2010-08-13 13 views
5

Mi pregunta es con referencia a this question que explica cómo virtual de funciones de trabajo en caso de corte en rodajas objeto que terminan llamando a la función virtual de la clase base y Wikipedia article que explica la disposición de la tabla virtual para una clase derivada para la continuación Códigofunciones virtuales de objetos rebanar

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 

Programa anterior salidas "In A :: func".

Pero, ¿cómo lo hace sin tabla virtual para la clase B saber acerca de la clase de base A :: func termina llamando A :: func

Respuesta

13

"mesa virtual para la clase B"? La tabla virtual para la clase B no está involucrada en la llamada oA.func(). El objeto oA tiene el tipo A, lo que significa que su tabla virtual es la de la clase A.

Además, la mayoría de los compiladores optimizarán la llamada oA.func() para que no use ninguna tabla virtual en absoluto. Como se conoce el tipo de oA en tiempo de compilación, la llamada oA.func() se puede dirigir inmediatamente al A::func sin utilizar ninguna tabla virtual.

11
A oA = *ptr1; 

Esto copia cualquier variable miembro en un nuevo objeto A. El puntero vtable no es una variable de miembro normal y es no copiado. Por lo tanto, cualquier función virtual posterior invocada contra este objeto actuará como si fuera un objeto A, porque es un objeto A.

Cuestiones relacionadas