Sto estendendo una classe fornita da una libreria di terze parti. La classe, chiamiamola Foo
, ha un metodo reset()
che può essere richiamato per riavviare il comportamento di Foo
. Il metodo reset()
viene anche utilizzato internamente dalla classe.Applicazione dei metodi di terze parti virtualità
class Foo
{
public:
void reset() {
/* ... */
}
void something() {
reset();
}
};
Finora, ho bisogno di sovraccaricare il metodo di reset()
al fine di ripristinare le mie funzioni aggiuntive così:
class Bar : public Foo
{
public:
void reset() {
/* ...something... */
Foo::reset();
}
};
Purtroppo, dal momento che il metodo Foo::reset()
non è virtuale, chiamando Bar::something()
ho la Metodo Foo::reset()
chiamato anziché Bar::reset()
.
C'è un modo (diverso dal sovraccarico di Foo::something()
per renderlo a ritroso-virtuale?
A proposito, in questo modo ho imparato a impostare sempre come virtuale qualsiasi metodo che sia pubblico e utilizzato internamente. – Dacav
Questa è una decisione sbagliata, Google per NVI e vedrai una tendenza ad evitare metodi virtuali pubblici. Il problema che stai affrontando è diverso: non puoi estendere una classe che non è stata progettata per essere estesa. –
Suppongo fortemente le interfacce non virtuali. usare metodi virtuali 'virtuali' è come restituire gli handle ai tuoi interni -> è un No-No. –