Newsgroup: it.comp.lang.c++
Titolo: inheritance

salve a tutti,
dato il seguente codice:
#include <iostream>
#include <vector>
#include <algorithm>
#include <function.h>
using std::iostream;
using std::vector;
using std::algorithm;
class A
{
private:
	int var;
public:
	A (int x=0): var(x)
	{
		cout << "Creato un oggetto A con valore " << var << endl;
	}
	virtual ~A (void)
	{
		cout << "Valore A distrutto: " << var << endl;
	}
	virtual void Print(void)
	{
		cout << "Class A val : " << var << endl;
	}
};
class B : public A
{
private:
	int var;
public:
	B (int x=0): A(),var(x)
	{
		cout << "Creato un oggetto B con valore " << var << endl;
	}
	~B (void)
	{
		cout << "Valore B distrutto: " << var << endl;
	}
	void Print(void)
	{
		cout << "Class B val : " << var << endl;
	}
};
class C : public B
{
private:
	int var;
public:
	C (int x=0): var(x)
	{
		cout << "Creato un oggetto C con valore " << var << endl;
	}
	~C(void)
	{
		cout << "Valore C distrutto: " << var << endl;
	}
	void Print(void)
	{
		cout << "Class C val : " << var << endl;
	}
};
int main(void)
{
	vector<A *> puntatori;
	A base(100);
	B ant(200);
	C pippo(300);
	puntatori.push_back(&base);
	puntatori.push_back(&ant);
	puntatori.push_back(&pippo);
	cout << "Print con for_each e vector di puntatori" << endl;
	for_each(puntatori.begin(),puntatori.end(),mem_fun(&A::Print));
	cout << "Senza puntatori" << endl;
	vector<A> nopunt;
	nopunt.push_back(base);
	nopunt.push_back(ant);
	nopunt.push_back(pippo);
	cout << "Fine push back" << endl;
	return 0;
}
ho il seguente output (ovviamente i commenti sono i miei ;-))
/* creazione di A */
Creato un oggetto A con valore 100
/* creazione di B */
Creato un oggetto A con valore 0
Creato un oggetto B con valore 200
/* creazione di C */
Creato un oggetto A con valore 0
Creato un oggetto B con valore 0
Creato un oggetto C con valore 300
Print con for_each e vector di puntatori
/* OK */
Class A val : 100
Class B val : 200
Class C val : 300
Senza puntatori
/* ?????????????????????????????????????? */
Valore A distrutto: 100
Valore A distrutto: 100
Valore A distrutto: 0
Fine push back
/* ????????????????????????????????????? */
Valore A distrutto: 100
Valore A distrutto: 0
Valore A distrutto: 0
/* distruzione di C */
Valore C distrutto: 300
Valore B distrutto: 0
Valore A distrutto: 0
/* distruzione di B */
Valore B distrutto: 200
Valore A distrutto: 0
/* distruzione di A */
Valore A distrutto: 100
ha a che fare con valori temporanei ?? ho cercato qualcosa con Google ma non ne
sono venuto a capo ...
grazie anticipate ....
-- 
#include <stdio.h>
int main(void){char c[]={10,65,110,116,111,110,105,111,32,98,97,114,98,111,110,
101,32,60,104,105,110,100,101,109,105,116,64,116,105,115,99,97,108,105,110,101,
116,46,105,116,62,10,10,0};printf("%s",c);return 0;}

 non ne sono venuto a capo ...
Trovi strani quei tre oggetti A in più?
I container effettuano copie degli oggetti passati come argomenti alle 
funzione di inserimento (insert, push_back, etc.). Se è necessario, le 
implementazioni possono generare oggetti temporanei intermedi. Se vuoi 
tracciare con precisione il lifetime di tutti gli oggetti devi implementare 
anche i costruttori copia (e magari stampare anche il valore di 'this').
Nota, inoltre, che che un container di oggetti T contiene oggetti il cui 
tipo è esattamente T. Se si passano oggetti di tipi derivati le copie 
residenti nel container saranno comunque di tipo T. (Ma questo credo tu  
lo sappia.)
Max

 Max
ciao e grazie ...


 ...
vector non copia solo l'oggetto che si sta inserendo, ma per esepio
puo` copiare tutti i suoi elementi quando deve ingrandire il buffer.
Se vuoi vedere quello che succede ti conviene far stampare un
messaggio anche al costruttore di copia, e mettere anche l'indirizzo
in tutte le stampe.
Esempio (codice non controllato):
  A::A(int x) : x(x) {
    cout << "Costruttore di A, this=" << this << ", x=" << x << "\n";
  }
  A::A(const A& a) : x(a.x) { 
    cout << "C. di copia di A, this=" << this << ", x=" << x << "\n";
  }
  A::~A() {
    cout << "Distruttore di A, this=" << this << ", x=" << x << "\n";
  }
In questo modo riesci ad abbinare ogni costruttore con il suo
distruttore e sapere quando viene creato e distrutto ogni oggetto.
        Mauro

 Mauro
ciao e grazie mille per l'aiuto ...


 Distrutto oggetto A con indirizzo 0x8053010e con valore 0
A occhio sembrano gli elementi del vector, pero` anche qua mancano i
messaggi del costruttore di copia.
         Mauro

 Mauro
ciao ... grazie mille per la pazienza ...
