Piccolo Cheat Sheet per il C++ parte 4

Quarta parte del Cheat Sheet per il C++

  • Ereditarietà

class classe-derivata: accesso classe-base {

...

}

se non metto il tipo di accesso:

  • se derivata è una class -> private
  • se derivata è una struct -> public

se public -> tutti i membri public della base sono public anche nella derivata (idem per i membri protected, restano protected), i membri private restano private e quindi non sono accessibili alla classe derivata

se private -> tutti i membri public e protected della base diventano private della derivata

se protected -> (accessibili solo a classe base e sue derivate) tutti i membri public e protected di base diventano protected in derivata

  • Ereditarietà multipla

class derivata: public base1, private base2 {

...

}

  • Passaggio di parametri al costruttore della classe base

costruttore-derivato(par1, par2, par3): costruttore-base1(par1, par2), costruttore-base2(par2)

{

...

}

  • Ripristino livelli di accesso originali

se ho una classe derivata con private su base, ma voglio mantenere public alcuni membri che in base erano public, posso usare la seguente "dichiarazione" nella classe derivata:

base::membro; // se membro è una funzione non metto () ma lascio solo il nome (come se fosse una variabile), non dichiaro nessun tipo.

ovviamente non si può alzare la visibilità di un membro (se è private nella base non posso renderlo public nella derivata)

  • classi base Virtuali

utilizzate per risolvere ambiguità con ereditarietà multipla (in caso di base, der1 e der2 che ereditano da base e der3 che eredità da der1 e der2), se dichiaro una classe virtuale nelle derivate non ho una duplicazione dei membri di base, ma ho una sola copia di tali membri.

class base {

public:

int x;

}

class der1: virtual public base {

...

}

class der2: virtual public base {

...

}

class der3: public der1, public der2 {

...

}

  • funzioni virtuali

funzione membro dichiarata come virtual in base (con tanto di implementazione) e ridefinita in derivata. se accedo a questa funzione tramite puntatore si applica polimorfismo a run-time, ovvero a run-time calcolo il tipo corrente dell’oggetto puntato ed invoco la funzione giusta (quella base oppure quella derivata)

class base {

virtual tipo func() {

...

}

...

}

il polimorfismo a run-time si applica anche utilizzando gli indirizzi invece dei puntatori.

se ho una funzione virtual in base, e der1 eredita da base, in der1 la funzione è ancora virtual, quindi se der2 eredita da der1 la funzione sarà ancora virtual.

  • funzioni virtuali pure

virtual tipo func() = 0;

in questo modo in base non è presente una implementazione della funzione, quindi tutte le classi derivate dovranno fornire un’implementazione, altrimenti ho un errore in compilazione.

se una classe contiene almeno una funzione virtuale pura -> classe astratta

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...