2011-01-28 16 views
7

Tengo dos clases:con funciones virtuales

class x { 
public: 
    virtual void hello() { 
    std::cout << "x" << std::endl; 
    } 
}; 

class y : public x { 
public: 
    void hello() { 
    std::cout << "y" << std::endl; 
    } 
}; 

Puede alguien explicar por qué las siguientes dos llamadas a hello() imprimir diferentes mensajes? ¿Por qué no ambos imprimen "y"? ¿Es porque el primero es una copia mientras que el segundo apunta al objeto en la memoria?

int main() { 
    y a; 

    x b = a; 
    b.hello(); // prints x 

    x* c = &a; 
    c->hello(); // prints y 
    return 0; 
} 
+3

Creo que esta es la primera vez que veo a alguien adivinar correctamente la causa, buen trabajo. – GManNickG

Respuesta

6

Sí, tiene usted razón

x b = a; 

invoca un constructor de copia (B es una 'x')

x& b = a; 

asigna una referencia y utilizará la anulación (b es todavía realmente una 'y')

0

x b = a copia a a b. Como b es tipo x, terminas con un objeto de tipo x. Un objeto de tipo x imprimirá x.

La única manera de obtener y es cuando llamas a un objeto de tipo y.

6

Porque x b = a;slices el objeto.

Cuando este código se ejecuta, crea un nuevo x, no un y, que es una copia del original y, a'.

+1

Gracias, aprendí una nueva palabra de vocabulario – Marlon

0

b.hello() imprime "x" porque b es una instancia de la clase X. c->hello() impresiones "y" porque c puntos a a y a es una instancia de la clase Y.

Lo que podría ser confuso para usted es que cuando escribe x b = a;, está creando un nuevo objeto b y lo inicializa con a. Cuando escribe x* c = &a;, c no es un objeto nuevo. Acaba de presentar un alias para un objeto existente.

Cuestiones relacionadas