martedì, giugno 12, 2007

C++: se lo conosci non ti uccide...

...e io stavo per rimanerci secco!!! ;)

Posto questo post (scusate la cacofonia) per gli "ignoranti" come me che ignorano.. o semplicemente dopo anni non si ricordano più.. della seguente "finezza" del C++.. che tanto fine non è in realtà: in C++ alla creazione di un oggetto i costruttori vengono richiamati dalle classi base alle classi derivate in catena secondo l'ordine con cui sono dichiarati nella sintassi del costruttore dopo l'operatore ':'. I distruttori invece vengono richiamati automaticamente in ordine inverso (notare, in ordine inverso anche rispetto a strani ordinamenti nel grafo aciclico ottenibile tramite l'ereditarietà multipla).
A parte il discorso del chaining, che ai più è noto, la finezza sta nelle operazioni che possono essere svolte all'interno dei costruttori e dei distruttori: chi di voi per caso volesse utilizzare il noto pattern "Abstract method" se lo scordi pure perchè all'interno di costruttori e distruttori non è possibile richiamare metodi virtuali puri relativi alla classe stessa, nemmeno se si ha a che fare con l'istanza di una classe derivata che li implementa concretamente. In sostanza niente "Abstract method" all'interno di costruttori e distruttori.. vi lascio un pezzettino piccolo piccolo di codice con cui giocare.


// The abstract superclass:
class A {
public:
// The constructor:
A() {
// Try to call but cannot dispatch:
virtualMethod();
}
// The virtual pure method:
virtual void virtualMethod()=0;
};

// My subclass
class B : public A {
public:
// The implementation:
virtual void virtualMethod() {};
};

// Using them:
int main(int argc, char *argv[]) {
// Instantiating:
B b;
b.virtualMethod();
return 0;
}

Nessun commento: