[C++] Dubbio su Distruttore Classe Base

di il
4 risposte

[C++] Dubbio su Distruttore Classe Base

Salve ho da poco iniziato a studiare il C++ e mi sto divorando il libro che ho, capitolo dopo capitolo. Ora essendo arrivato all'ereditarietà e al polimorfismo, mi sono imbattuto in un esercizio che ho trovato in rete.

Per farla breve il testo chiede di creare una classe Persona con i seguenti attributi: nome, cognome e codice fiscale. E qui dovevo creare un costruttore per inizializzare da tastiera gli attributi e un distruttore e specificare a video quando ciò accadeva (con un cout niente di che). Dovevo inoltre creare un metodo per la stampa di ciò che ho scritto.

Per la seconda parte del problema dovevo creare una seconda classe che derivasse dalla prima e dovevo chiamarla Studente e inserire gli attributi N°Matricola e Corso di Laurea, anche qui con un costruttore, un distruttore e un metodo di stampa dei dati.

Il problema l'ho risolto tranquillamente, solo che ho un dubbio su una cosa. Quando richiamo il distruttore di Studente in automatico mi richiama anche quello di persona. Per facilitarvi le cose vi posto il listato.
#include <iostream>
#include <string>
using namespace std;

class Persona{
	//Dichiarazioni variabili "Persona"
	string nome;
	string cognome;
	string codFISC;

public:
	Persona(string n, string c, string cF){
		//Costruzione delle istanze
		nome = n;
		cognome = c;
		codFISC = cF;

		cout << "\n -- Costruzione Oggetto \"aln\" -- \n";
	}

public:
	~Persona(){
		//Distruzione delle istanze
		cout << "\n -- Distruzione oggetto \"person\" -- \n";
	}

public:
	Persona(){ //Costruttore obbligatorio per ereditare
		//Vuoto
	}

public:
	void print(){
		//Stampa Dati	
		cout << "\nDati Informativi\n\n";
		cout << nome << endl << cognome << endl << codFISC << endl << endl;
	}
};

class Studente : Persona{
	//Dichiarazioni variabili "Studente"
	string matr;
	string corso;

public:
	Studente(string m, string cor){
		//Costruzione delle istanze
		matr = m;
		corso = cor;

		cout << "\n -- Costruzione Oggetto \"aln\" -- \n" << endl;
	}

public:
	~Studente(){ //Distruzione delle istanze
		cout << "\n -- Distruzione oggetto \"aln\" -- \n";
	}

public:
	void print(){
		//Stampa dati "Studente"
		cout << "\nDati Aggiuntivi\n\n";
		cout << matr << endl << corso << endl;
	}
};

int main(){

	string n;
	string c;
	string cF;

	cout << "Inserisci il Nome, il Cognome e il Codice Fiscale della Persona: \n";
	cin >> n >> c >> cF;

	Persona pers(n, c, cF);
	pers.print();
	pers.~Persona();

	string m;
	string cor;

	cout << "\n\nInserisci il Numero di Matricola e il Corso di Laurea frequentato dallo Suedente: \n";
	cin >> m >> cor;

	Studente aln(m, cor);
	aln.print();
	aln.~Studente();

	cout << endl << endl;

	system("PAUSE");
	return 0;
}
Questo che mi succede è uno spreco delle risorse o non implica niente? Grazie...

4 Risposte

  • Re: [C++] Dubbio su Distruttore Classe Base

    Perché dici che è uno spreco di risorse? Quali risorse?
  • Re: [C++] Dubbio su Distruttore Classe Base

    Quindi il fatto di distruggere due volte gli stessi dati non influisce minimamente sul programma?
  • Re: [C++] Dubbio su Distruttore Classe Base

    Pirand92 ha scritto:


    Quindi il fatto di distruggere due volte gli stessi dati non influisce minimamente sul programma?
    Stai pasticciando: i dati NON VENGONO DISTRUTTI DUE VOLTE, altrimenti si genererebbero delle situazioni di incosistenza con conseguenze devastanti: non funzionerebbe piu' assolutamente nulla, il numero delle volte che un oggetto verrebbe distrutto dipenderebbe dalla profondita' di derivazione, ... un disastro!


    Ma basta studiare questo esempio per capire come funziona il tutto:
    
    
    #include <cstdlib>
    #include <stdio.h>
    
    class A {
    protected:
        int i;
    public:
        A(int i):i(i){
            printf("A(%d)\n",i);
        }
        
        ~A(){
            printf("~A(%d)\n",i);
        }
    };
    
    class B : public A {
    public:
        B(int i):A(i){
            printf("B(%d)\n",i);
        }
        
        ~B(){
            printf("~B(%d)\n",i);
        }
    };
    
    class C: public B {
    public:
        C(int i):B(i){
            printf("C(%d)\n",i);
        }
        
        ~C(){
            printf("~C(%d)\n",i);
        }
    };
    
    /*
     * 
     */
    int main(int argc, char** argv) {
        
        A a(11);
        B b(21);
        C c(31);
        
        A *pa = new A(12);
        B *pb = new B(22);
        C *pc = new C(32);
        
        delete pc;
        delete pb;
        delete pa;
        
        return 0;
    }
    
  • Re: [C++] Dubbio su Distruttore Classe Base

    Forse adesso ho capito, ho eseguito quel codice che mi hai scritto e da lì ho visto che se eseguivo la classe A il costruttore stampava A(i), mentre se eseguivo la classe B venivano stampati a video sia A(i) che B(i) e così via.

    Quindi se non ho capito male lo stesso discorso vale per il mio listato, dove quando eseguo il distruttore di Studente per le proprietà dell'Ereditarietà viene eseguito il Distruttore di Persona. Non distrugge niente però, perché quello che c'era è stato già distrutto. Sbaglio o ho capito bene?
Devi accedere o registrarti per scrivere nel forum
4 risposte