PDA

View Full Version : [c++]problema Ereditarieta multipla


tglman
31-05-2007, 08:48
Allora ...
E arrivato il momento di porvi un problemino alquanto complesso ;)
che preferisco descrivervi con il codice:

class Assassino
{
public:
virtual void uccidi()=0;
}

class Accoltellatore: public Assassino
{
public:
virtual void prendiColtello()=0;
}

class Pistolero: public Assassino
{
public:
virtual void prendiPistola()=0;
}

Preso questo esempio io vorrei una classe che discrivesse tutti i comportamenti, e quindi implemento:


class Stragista: public Accoltellatore,public Pistolero
{
/* Implemento tutti i metodi virtuali.
*/
}


e poi vado ad utilizzare cosi:

void main()
{
Assassino * ass = new Stragista();
}


Essendomi ormai(purtroppo) abituato al java pensavo che questo funzionava ...
inveci mi da un bel errore del tipo:
impossibbile assegniare a Assassino * perchè ambiguo...

Cosa vuol Dire ??

andbin
31-05-2007, 10:13
impossibbile assegniare a Assassino * perchè ambiguo...

Cosa vuol Dire ??Che questo è il "diamond problem (http://en.wikipedia.org/wiki/Diamond_problem)".

Ah ... i nomi che hai usato sono bellissimi. :D

tglman
31-05-2007, 10:32
Non posso provare ma ad intuito la soluzione dovrebbe essere questa:


class Assassino
{
public:
virtual void uccidi()=0;
}

class Accoltellatore: public virtual Assassino
{
public:
virtual void prendiColtello()=0;
}

class Pistolero: public virtual Assassino
{
public:
virtual void prendiPistola()=0;
}


Grazie Ancora!!

tglman
31-05-2007, 20:43
Sembrava risolto invece ecco qua.....
ho un problem del genere:

Assassino *ass=....
Accoltellatore *acc = (Accoltellatore *)ass;


mi da:
error: cannot convert from base ‘Assassino’ to derived type ‘Accoltellatore’ via virtual base ‘Assassino’

e adesso.......

tomminno
01-06-2007, 12:35
Così dovrebbe funzionare.


Assassino *ass= new Accoltellatore();
Accoltellatore *acc = dynamic_cast<Accoltellatore *>ass;
if (acc != NULL)
...