(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