MEC++: Ctor e funzioni non-membro virtuali

Appunti tratti dalla rilettura di More Effective C++ di Scott Meyers. Quinto blocco: Tecniche.

(25) Costruttori e funzioni non-membro virtuali.

Un vero costruttore non può essere virtuale, non avrebbe senso. Ma é utile a volte avere una sorta di copy-ctor virtuale, che ci permetta di clonare un oggetto appartenente ad una gerarchia.

La cosa può essere fatta in questi termini:

class Base {
public:
virtual Base* clone() const = 0;
// ...
};

class Derived1 : public Base {
public:
virtual Derived1* clone() const
{ return new Derived1(*this); }
// ...
};

class Derived2 : public Base {
public:
virtual Derived2* clone() const
{ return new Derived2(*this); }
// ...
};


Altrettanto insensato é il concetto di funzione non-membro virtuale. Ma in alcuni contesti é altrettanto utile, tipo quando vogliamo ridefinire l'operatore << per una gerarchia di classi.

In questo caso la soluzione é semplice e lineare: definiamo una funzione non membro che ha il solo scopo di richiamare la funzione virtuale dell'oggetto.

Ad esempio:

class Base {
public:
virtual ostream& print(ostream& s) const = 0;
// ...
};

class Derived1 : public Base {
public:
virtual ostream& print(ostream& s) const;
// ...
};

class Derived2 : public Base {
public:
virtual ostream& print(ostream& s) const;
// ...
};

inline ostream& operator<<(ostream& s, const Base& c)
{
return c.print(s);
}

Nessun commento:

Posta un commento