Newsgroup: it.comp.lang.c++
Titolo: [?] nuove funzioni membro in classi derivate

Salve a tutti.
Ho un dubbio con le classi derivate.
E' corretto definire nuove funzioni membro che non esistono nella
classe derivata?
Un esempio:
class A
{
public:
A();
virtual void a();
void b();
virtual void c();
}
class B : public A
{
public:
B();
void a();
void c();
void d(); // E' corretto?
}
Il dubbio mi č venuto con l'uso del polimorfismo in queste situazioni:
le nuove funzioni membro non vengono accettate dal compilatore.
Ecco un esempio:
vector<A*> myA;
myA.push_back(new B);
myA[0]->d(); // ERRORE!
E del resto non posso dare tutti i torti al compilatore perchč io
dichiaro un puntatore ad un oggetto A che non contiene la funzione
d().
Da questo devo dedurre che questa pratica č scorretta? 

 Da questo devo dedurre che questa pratica č scorretta? 
No, devi dedurre che sei incappato in un tipico problema che 
richiederebbe l'uso di RTTI (Run Time Type Information). Ovvero, il 
contenitore contiene dei puntatori ad A - tu puoi sapere solo a Runtime 
se questi sono poi anche dei B o meno (probabilmente alcuni di essi non 
saranno dei B, altrimenti avresti fatto un contenitore di B*). In 
realta', se sei sicuro che li' c'e' un B, puoi bellamente fare:
((B*)myA[0])->d();
E fregartene. Tieni d'altronde a mente che nel 90% dei casi, trovarsi a 
scrivere del codice del genere indica che si e' mal progettato il 
programma, e che in realta' esiste una soluzione type-safe per fare la 
stessa cosa.
Cmq, ti consiglio di leggere qualche testo di C++ che tratti 
l'argomento, si tratta di questioni abb di base.
-- 
Mat/tia Belletti - Undergraduate student @ 
cs.unibo.it
ICQ: 33292311    - email: 
mbel...@cs.unibo.it
IRC: RedGlow     - site(s): 
http://mbellett.web.cs.unibo.it/
Linux registered user 299762 @ Linux registered machine 213003

l'argomento, si tratta di questioni abb di base.
Io sto studiando con Fondamenti di C++ di Cay Horstmann, McGraw Hill.
Negli esempi del libro di solito questo tipo di problemi viene risolto
con le funzioni virtuali.
Io volevo sapere solo se esisteva una soluzione più efficente e più
generale e credo tu me l'abbia data.  Infatti io potrei non avere la
possibilità di modificare la classe base e quindi sarei costreto a
creare una classe derivata intermedia che contiene tutte le funzioni
virtuali e quindi derivare le mie classi da questa.
Grazie per l'attenzione.
Salvo

 virtuali e quindi derivare le mie classi da questa.
Questa e' una soluzione che generalmente si puo' adottare, si'.



 
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 più lento, 
Più lento de che cosa? Quando ho bisogno d'un dinamismo, perchè non
connosco il tipo, non conosco niente di più rapide. Et quando conosco il
tipo, e il compilatore lo conosce anche, il complatore non usa il
binding dinamico, anche se la funzionne è virtual.
Il probleme non è la velocità. Il probleme è la significazione de quallo
che fai. Se set_text non a une significazione in generale per uno Shape,
la classa Shape non deve aver la funzionne.
Eventuellamente si potrebbe essere che una classa ha la nozione di
funzionalità optionale. Allora, si può pensare a una funzione del genere
supportsText(). Nella classa di basa, allora, supportsText rende false,
et set_text contiene assert(0) -- une precondizione de set_text sarebbe
che supportsText rende true. Era infatti la soluzione classica del
probleme. Oggi, credo che une « interface » Text, di qui TextShape
erita, sarebbe più indicata ; per sapere si un obietto supporta le
funzionei di Text, utilizarò dynamic_cast.
--
James Kanze           GABI Software         
http://www.gabi-soft.fr
Conseils en informatique orientée objet/
                   Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, 
+33 (0)1 30 23 00 34

funzionei di Text, utilizarò dynamic_cast.
questa forse è una soluzione più avanzata e purtroppo ancora non so
cosa sia un dynamic_cast. sono solo agli inizi....
merci per l'esauriente risposta...
au revoir