Questo mi ha sorpreso un po ', ma stavo giocando con un po' di codice e ho scoperto che, almeno sul mio computer, quando una funzione accetta una classe genitrice per riferimento e si passa un'istanza child, che il problema di slicing non lo fa si verificano Per illustrare:Il passaggio per riferimento evita sempre il problema dell'affettatura?
#include <iostream>
class Parent
{
public:
virtual void doSomething()
{
using namespace std;
cout << "Parent::DoSomething" << endl;
}
};
class Child : public Parent
{
public:
virtual void doSomething()
{
using namespace std;
cout << "Child::DoSomething" << endl;
}
};
void performSomething(Parent& parent)
{
parent.doSomething();
}
int main(int argc, char** argv)
{
Child myChild;
performSomething(myChild);
return 0;
}
Questo stampa Child::DoSomething
.
Come ho detto, sono rimasto un po 'sorpreso. Voglio dire, so che il passaggio per riferimento è come che passa i puntatori in giro (ma molto più sicuro per la mia comprensione), ma non sapevo che avrei comunque dovuto mantenere la bontà polimorfica nel farlo.
Voglio solo assicurarmi, è questo dovrebbe succedere o è uno di quelli tipo "funziona sulla mia macchina" di istanze?
Questo non è ciò che "slicing" è. Inoltre, questo codice è compilabile? Che cosa è 'using std;'? –
Significa che deve essere 'using namespace std'. Ho pensato che ero in grado di ottenere il punto attraverso, ma ripulito il codice per il beneficio complessivo del sito. – Anthony