Newsgroup: it.comp.lang.c++
Titolo: errata comprensione dell'ereditarietà

 >class Base {
 >      public:
 >               void funzione() {}
 >};
 >
 >class Base2 {
 >      public:
 >                int funzione() { return 0}
 >};
 >
 >class derivata: public Base, public Base2 {};
 >
 >La derivata non ha ridefinito funzione e quantunque l'avesse fatto non
 >dovrebbe dare errore in quanto possiedo o una situazioni di overloading
 >errato o cmq una situazione instabile?
E` da un bel pezzo che non uso l'ereditarieta` multipla, ma mi sembra
che il codice da te scritto sia assolutamente corretto (a parte un ';' dopo la
return), semplicemente quando si invoca funzione tramite una istanza di
derivata, devi specificare quale versione utilizzare:
derivata a;
a.funzione();    // ambigua!
a.Base2::funzione();   // OK
Il compilatore rileva l'ambiguita` nella riga 2 (e non prima) perche`
le due versioni di "funzione" appartengono a namespace diversi.
Se tu avessi definito "funzione" nella classe derivata, avresti avuto (se 
non erro)
un caso di overriding.
 >Ecco l'altro caso:
[omissis]
Analogo al precedente, con la differenza che in caso di ridefinizione
nella classe derivata avresti avuto comunque un errore di
overriding.
Paolo
p.s.
   Nota importante per chi fa delle prove con VC++, il compilatore
tanto per cambiare in questo non e` conforme allo standard.
--
Paolo Marotta
Duck Communication Entertainment s.r.l.
Largo Arenula, 11 - Roma
http://www.duckce.com
p.ma...@duckce.com
-- 
Posted from 
HA-server-a.cs.interbusiness.it
 [151.99.250.31] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

un caso di overriding.
Ma la ridefinizione di un metodo non consiste nel definire un metodo con la
stessa signature (parametri, nome e valore di ritorno uguale)?
Con overridding intendi solamente definire un metodo con lo stesso nome?
Comunque sia ecco la sorgente del dubbio:
class Base1 {
       public:
                int metodo() { return 0; }
};
class Base2 {
       public:
                void metodo() {}
};
class derivata:public Base1, public Base2 {
       public:
                void metodo() {}
};
Errore tradotto in italiano: impossibile effettuare la ridefinizione del
metodo ereditato o di entrambi.
Facendo nuovamente riferimento all'esempio precedente:
class derivata: public Base1, public Base2 {
         public:
                 char metodo() { return 50 };    
};
Errore: la ridefinizione di un metodo ereditato deve presentare la stessa
segnatura: errore nel tipo di ritorno.
Grazie per quanto detto fin'ora.
-- 
La classifica dei prodotti MS:
C#, la migliore barzelletta di Bill Gates.
Visual C++, il meno standard dei compilatori C++.
J++, la copiatura più riuscita.
Windows, il più instabile.
Visual Basic, un esempio di prodotto decente della MS - forse l'unico -.
OutlookExpress, scandali su scandali.
La classifica degli "amici" coglioni:
Stefano Zanchi, il miglior lamer del mondo.
 

 tanto per cambiare in questo non e` conforme allo standard.
dì la verità, questo compilatore proprio non ti piace eh? beh, anch'io
mi lamentavo, poi x lavoro mi hanno affibiato un progetto da fare in
Power++. Adesso, alla notte, i miei mi hanno detto che parlo nel sonno
mormorando frasi sconnesse tipo 'Bill... perdonami!'. Dura la realtà
:(