Problema sul costruttore di copie e classi derivate
Von: Mirko (mirko.rosi@gmail.com) [Profil]
Datum: 07.05.2008 20:25
Message-ID: <85903c93-1ee2-4932-a1fb-b369bf4ff026@p25g2000hsf.googlegroups.com>
Newsgroup: it.comp.lang.c++
Datum: 07.05.2008 20:25
Message-ID: <85903c93-1ee2-4932-a1fb-b369bf4ff026@p25g2000hsf.googlegroups.com>
Newsgroup: it.comp.lang.c++
Ciao a tutto il newsgroup, ho un problema (che mi sembra anche idiota)
ma non riesco a risolverlo. Mi spiego:
Ho una classe base B e alcune classi derivate, diciamo D1, D2, D3, che
ulteriormente vengono derivate in D1_1, D1_2, D2_1, D_3_1.
Mi trovo in una funzione con una reference a B (B& rb) e devo
duplicare questa istanza tramite una new, ma se faccio
B* pb = new B(rb)
mi ritrovo una istanza puntata da pb di classe B, anche se la
reference rb magari faceva riferimento, per esempio, ad una D2_1.
Provo a postare due righe estratte dal mio programma:
class B {
int _i;
public:
B(int i) : _i(i) {};
}
class D1 : public B {
int _d1;
public:
D1(int i, int d1) : B(i), _d1(d1) {};
}
class D2 : public B {
float _d2;
public:
D2(int i, float d2) : B(i), _d2(d2) {};
}
class D1_1 : public D1 {
int _d1_1;
public:
D1_1(int i, int d1,int d1_1) : D(i, d1), _d1_1(d1_1) {};
}
class D1_2 : public D1 {
double _d1_2;
public:
D1_2(int i, int d1, double d1_2) : D(i, d1), _d1_2(d1_2) {};
}
// altre classi derivate...
// LA FUNZIONE
void myFunc(B& rb) {
// codice...
B* pb = new B(rb); // <- pb punta ad una istanza di B e non della
classe D1_2 della rb!
// codice ...
}
int main() {
D1_2 d1_2(10, 11, 0.0);
myFunc(d1_2);
}
Concettualmente il funzionamento mi sembra corretto: ho invocato io il
costruttore della B invece che della derivata, ma come si risolve
questo caso? Ho pensato ad una serie di if/else if per tutte le
possibili derivate, ma non mi sembra una gran soluzione (e se aggiungo
una derivata D3_2 chi si ricorda di andare ad aggiungere un'altro
if !!)
Nota: non ho definito un costruttore di copia, ma ho usato quello di
default, ma non penso che cambi il problema.
Un grazie in anticipo a chi ha voglia di spiegarmi una soluzione
migliore.
Ciao Mi.
[ Auf dieses Posting antworten ]
