salve vorrei sapere la differenza tra questi due codici che non riesco a capire qualè?

perchè l'output del programma A è differente dal programma B ( i programmi differiscono da un solo carattere = & )

Programma A:
Codice PHP:
class CommunicationDevices
{
public:
virtual void which(){
cout<<"This is a common device..."<<endl;
}
};
class 
MobilePhoneWithGSMSupport: public CommunicationDevices
{
public:
virtual void which(){
cout<<"This is a Mobile Phone...GSM Supported"<<endl;
}
};
class 
MobilePhoneWithCDMASupport: public CommunicationDevices
{
public:
void which(){
cout<<"This is a Mobile Phone....CDMA Supported"<<endl;
}
};
void whichPhoneUserIsUsing(CommunicationDevices &devices){
devices.which();
}
int main(){
MobilePhoneWithGSMSupport user1;
MobilePhoneWithCDMASupport user2;
whichPhoneUserIsUsing(user1);
whichPhoneUserIsUsing(user2);


Programma B:
Codice PHP:
class CommunicationDevices
{
public:
virtual void which(){
cout<<"This is a common device..."<<endl;
}
};
class 
MobilePhoneWithGSMSupport: public CommunicationDevices
{
public:
virtual void which(){
cout<<"This is a Mobile Phone...GSM Supported"<<endl;
}
};
class 
MobilePhoneWithCDMASupport: public CommunicationDevices
{
public:
void which(){
cout<<"This is a Mobile Phone....CDMA Supported"<<endl;
}
};
void whichPhoneUserIsUsing(CommunicationDevices devices){
devices.which();
}
int main(){
MobilePhoneWithGSMSupport user1;
MobilePhoneWithCDMASupport user2;
whichPhoneUserIsUsing(user1);
whichPhoneUserIsUsing(user2);

1° OUTPUT PRIMO PROGRAMMA

This is a mobile phone... GSM supported
This is a mobile phone... CDMA supported

2° OUTPUT SECONDO PROGRAMMA

This is a common device...
This is a common device...

-----------------------------------------

Non capisco perchè il passaggio tramite puntatore ( &devices ) fa questo effetto sull'output!!

Grazie