Salve a tutti, sono nuovo e ho il seguente problema:
sto realizzando un programma in C++ utilizzando Visual C++ 6.0 e ho una situazione di questo tipo:
class persona{
string attributo1;
...
}
class padre : virtual public persona{
string attributo2;
...
}
class madre : virtual public persona{
string attributo3;
...
}
class figlio :public padre,public madre{
string attributo4;
...
}
ogni sottoclasse eredita l'attributo della classe dalla quale eredita... insomma mi trovo di fronte ad un classico caso di ereditarietà multipla...
il problema è che ho creato una rubrica in cui ho un array di puntatori a "persona" e un contatore che parte da 0 e viene incrementato ogni volta che viene aggiunto un indirizzo nell'arrey:
int count=0;
persona *persone[100]
e quando devo riempire questo array con sottoclassi della classe "persona" faccio così:
persona[count] = new madre;
(persone[count]->attributo1="tizia";
((madre *)persone[count])->attributo3="generosa";
count++;
ma, nel far questo, il programma non parte poichè segnala il seguente errore riferito alla riga di codice che ho sottolineato:
- cannot convert a 'persona*' to a 'madre*'; conversion from a virtual base class is implied
Se invece faccio ereditare padre e madre da persona come classe base normale e NON come virtual ,questo problema si risolve ma , nel momento in cui voglio rempire l'arrey con puntatore a classe figlio in questo modo:
persona[count] = new figlio; /*1*/
(persone[count]->string1="caio";
((figlio *)persone[count])->string2="permaloso"; /*2*/
((figlio *)persone[count])->string3="veloce"; /*3*/
((figlio *)persone[count])->string4="basso"; /*4*/
count++;
ho uno errore riferito alle righe 1,2,3,4 e cioè:
- ambiguous conversions from 'class figlio *' to 'class persona *'
Allora ,rimuovendo sempre l'ereditarietà "virtual" come ho fatto prima ,ho risolto così:
padre* p;
p = new figlio;
persona[count] = p;
(persone[count]->string1="caio";
((figlio *)(padre *)persone[count])->string2="permaloso";
((figlio *)(padre *)persone[count])->string3="veloce";
((figlio *)(padre *)persone[count])->string4="basso";
count++;
così funziona a meraviglia, ma francamente mi sembra molto strana come soluzione....e poi io vorrei dichiarare l'eredità di padre e madre da persona come virtual per evitare che nell'oggetto figlio ci siano 2 copie di persona..
Qualcuno di voi potrebbe darmi delucidazioni a riguardo?...per me è molto importante poichè devo presentare al mio professore un progetto che ha all'interno un meccanismo simile...