2011-01-28 13 views
7

Ho due classi:Domanda con funzioni virtuali

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

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

Qualcuno può spiegare perché i seguenti due chiamate a ciao() stampare i messaggi differenti? Perché entrambi non stampano "y"? È perché il primo è una copia mentre il secondo punta effettivamente all'oggetto in memoria?

int main() { 
    y a; 

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

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

Penso che questa sia la prima volta che vedo qualcuno indovinare correttamente la causa, buon lavoro. – GManNickG

risposta

6

Sì, hai ragione

x b = a; 

invoca un costruttore di copia (B è un 'x')

x& b = a; 

Assegna un riferimento e userà l'override (b è ancora in realtà una 'y')

0

x b = a copie da a b. Poiché b è di tipo x, si finisce con un oggetto di tipo x. Un oggetto di tipo x stamperà x.

L'unico modo per ottenere y è quando si chiama in un oggetto di tipo y.

6

Perché x b = a;slices l'oggetto.

Quando questo codice viene eseguito, crea una nuova x, non un y, che è una copia dell'originale y, a'.

+1

Grazie, ho imparato una nuova parola sul vocabolario – Marlon

0

b.hello() stampe "x", perché b è un'istanza della classe X. c->hello() stampe "y", perché c punti a a, e a è un'istanza della classe Y.

Ciò che potrebbe essere fonte di confusione per voi è che quando scrivi x b = a;, stai creando un nuovo oggetto b e inizializzalo con a. Quando scrivi x* c = &a;, c non è un nuovo oggetto. Hai appena introdotto un alias su un oggetto esistente.

Problemi correlati