Newsgroup: it.comp.lang.c++
Titolo: Classi C++ e loro derivate

salve
ho un problema con la programmazione ad oggetti in c++.
Devo creare due classi, l'una base e l'altre derivata da questa.
La classe base ha all'interno solo oggetti di un tipo A- precedentemente
definiti - mentre la classe derivata contiene solo oggetti di tipo B, con lo
stesso ruolo degli oggetti A e derivati da questi ultimi o comunque derivati
dalla stessa classe da cui sono derivati gli oggetti A.
La domanda č: č concorde con la programmazione ad oggetti creare una classe
derivata con all'interno oggetti diversi ( l'utilizzo avviene mediante dei
puntatori)?
Inoltre č meglio derivare B da A o farli derivare entrambi da una classe
base unica?

 base unica?
Per il tuo problema penso ti convenga creare una classe interfaccia (in
genere con metodi virtuali puri) da cui deriverai la Derived_A e la
Derived_B. In ognuna ridefinirai le funzioni virtuali, così da poter
sfruttare un puntatore alla classe interfaccia per l'accesso incondizionato
ad entrambe.
Es:
class Interface {
  //........
  public:
    virtual void Use_me() = 0;
};
class Derived_A : public Interface {
    A object;
  public:
    void Use_me() { /*fai quello che vuoi*/ }
};
class Derived_B : public Interface {
    B Object;
  public:
    void Use_me() { /*fai quello che vuoi*/ }
};
Interface *MyInterfacePtr;
Ora, sia che un puntatore "Interface *" punti ad un oggetto Derived_A, sia
che punti ad un oggetto Derived_B, ti è possibile scrivere
MyInterfacePtr->UseMe();
Ciao
Domenico Barra

grazie mille per la risposta
purtroppo provando a creare una classe virtuale ho avuto qualche problema
Dovrei riuscire a creare un gestore di alberi e liste. Ora il mio problema
č: meglio partire dalla creazione di una classe base per la gestione degli
alberi e restringerne poi l'uso per la gestione delle liste o fare il
viceversa.
Nel primo caso utilizzerei un solo tipo di oggetto puntato, ma non so se
sarei in sintonia con la programmazione ad oggetti.
(praticamente l'idea č quella di usare gli oggetti con due puntatori  non
considerandone uno).
Nel secondo caso mi troverei di fronte ad un problema di puntatori, quindi
nel caso descritto dalla mia prima domanda. Infatti dovrei fra discendere
una classe da una altra, facendole usare oggetti di tipo diverso da quelli
della sua classe base.
grazie per l'attenzione

 viceversa.
Personalmente vedo la gestione di un albero un po' diversa dalla gestione di
una lista. Se vuoi gestire un albero e una lista con un unico tipo di
puntatore, crea una classe base (ad esempio "Container") astratta che funga
da interfaccia. In questa base metti tutti i membri e le funzioni comuni (le
prime che mi vengono in mente sono quelle di ricerca).
Es:
class Container {
  public:
    AnyType *search_for(WhateverYouWant) = 0;
};
Poi fai derivare la classe Tree da Container, e cosě anche la classe List.
Poi ti fai l'implementazione di queste due classi come meglio credi
(implementando ovviamente anche la funzione search_for).
Dopo, dovresti poter fare:
//////////////////////////////////////////
Container *p;
p = new Tree;
p->search_for("Ciao"); //chiama Tree::search_for
delete p;
p = new List;
p->search_for("Ciao); //stavolta chiama List::search_for
delete p;
//////////////////////////////////////////
Quando chiami search_for (che č una funzione virtuale), la funzione chiamata
tra le due (quella implementata da List o quella implementata da Tree)
dipende dal tipo dell'oggetto puntato al momento dell'invocazione.
Ciao, spero di non averti confuso le idee.
Domenico Barra

mille grazie
ci provo..!