C++ costruttori ed ereditarietà. Variabili private

di il
2 risposte

C++ costruttori ed ereditarietà. Variabili private

Ciao, sto provando a fare ereditare delle variabili private dichiarate in una superclasse alla sua sottoclasse.
So che basterebbe dichiararle protected o public ma se sono private?
Vorrei fare come in JAVA quando nel costruttore della sottoclasse uso super.
E' possibile fare questa cosa?
Ho provato con una friend function ma non riesco, quindi ho bisogno del vostro aiuto.

Questa è la classe anagrafica
#ifndef ANAGRAFICA_H
#define ANAGRAFICA_H
#include<string>

using namespace std;

class Anagrafica
{
    public:
        Anagrafica();
        void registra();
        void mostra();
        friend void creaStudente(int ,string ,string  );

    protected:

    private:
        int codice;
        string cognome;
        string nome;
        bool registrato;
};

#endif // ANAGRAFICA_H
#include "Anagrafica.h"
#include<iostream>

    Anagrafica::Anagrafica()
    {
     registrato=false;
    }

    void Anagrafica::registra()
    {
    registrato=true;
    }

    void Anagrafica::mostra()
    {
    if(registrato){
        cout<<codice<<endl;
        cout<<cognome<<endl;
        cout<<nome<<endl;
        cout<<"----"<<endl;
    }
    else{
        cout<<"non registrato"<<endl;
    }
    }

Questa è la studente che eredita da anagrafica
#ifndef STUDENTE_H
#define STUDENTE_H

#include <Anagrafica.h>


class Studente : public Anagrafica
{
    public:
        Studente();
        void promuovi();
        void controlla();

    protected:

    private:
        bool promosso;
};

#endif // STUDENTE_H
#include "Studente.h"
#include<iostream>



Studente::Studente(){}

void Studente::promuovi()
{
    promosso=true;
}

void Studente::controlla()
{
    if(promosso){
        cout<<"studente promosso"<<endl;
    }
    else{
        cout<<"non promosso"<<endl;
    }
}
Questo è ilmain
#include <iostream>
#include"Anagrafica.h"
#include"Studente.h"

using namespace std;

int main()
{
    cout << "Hello world!" << endl;
    Studente s1;
    char risposta;

    s1.creaStudente(1,"rossi","mario");
    return 0;
}

2 Risposte

  • Re: C++ costruttori ed ereditarietà. Variabili private

    Stai facend un ENORME CAS... PASTICCIO!

    L'ereditarieta' funziona SOLO con i metodi, NON con i membri di istanza, che tu ERRONEAMENTE chiami variabili: NON SONO VARIABILI !!!!

    Oltre al fatto che SOLO I METODI VIRTUALI del C++ sono l'equivalente dei metodi in Java! NON i metodi NON VIRTUALI !!!!

    Lasciando da parte la questione friend:

    1) un membro privato E" VISIBILE SOLO nella classe in cui viene definito
    2) un membro protected E' VISIBILE nella classe in cui viene definito E NELLE SUE sottoclassi
    3) un membro public E' VISIBILE da chiunque.

    Se tu definisci, in una sottoclasse, un membro con lo stesso nome di uno presente in una delle classi precedenti nella gerarchia, semplicemente vai a nascondere la definizione precedente, ma NON A SOSTITUIRE. Questo vuol dire che la nuova definizione e' visibile dalla classe in cui il nuovo membro e' definito alle sottoclassi.

    Se e' pubblico, allora hai il problema di SPECIFICARE il membro DI QUALE classe vuoi fare riferimento:

    Esempio:
    
    class B {
    private:
        int pri;
    protected:
        int pro;
    public:
        int pub;
        B(): pri(11),pro(12),pub(13){}
    };
    
    class D: public B{
    private:
        int pri;
    protected:
        int pro;
    public:
        int pub;
    
        D(): pri(21),pro(22),pub(23),B(){}
    };
    
    class E: public D {
    private:
        int pri;
    public:
        E(): pri(31),D(){}
    };
    
    
    
    int main() {
    
        B b;
        D d;
        E e;
    
        std::cout << e.pub << std::endl;
        std::cout << e.B::pub << std::endl;
    
        return 0;
    }
    
    
  • Re: C++ costruttori ed ereditarietà. Variabili private

    Ok ho capito, si risolve impostando i membri come protected o private
    Però in questo modo non vado a violare i principi di OOP (information hiding) secondo cui i membri di istanza devono sempre avere accesso private e i metodi devono essere public?
Devi accedere o registrarti per scrivere nel forum
2 risposte