Estoy extendiendo una clase proporcionada por una biblioteca de terceros. La clase, llamémosla Foo
, tiene un método reset()
que se puede invocar para reiniciar el comportamiento de Foo
. El método reset()
también es utilizado internamente por la clase.Exigir la virtualidad de los métodos de terceros
class Foo
{
public:
void reset() {
/* ... */
}
void something() {
reset();
}
};
Hasta ahora, necesito sobrecargar el método reset()
con el fin de restablecer mis características adicionales, así:
class Bar : public Foo
{
public:
void reset() {
/* ...something... */
Foo::reset();
}
};
Por desgracia, ya que el método Foo::reset()
no es virtual, llamando Bar::something()
consigo el Foo::reset()
método llamado en lugar de Bar::reset()
.
¿Hay alguna manera (diferente de sobrecargar Foo::something()
también) de volverla virtual?
Por cierto, de esta forma aprendí a establecer siempre como virtual cualquier método que sea tanto público como usado internamente. – Dacav
Esa es una mala decisión, google para NVI y verá una tendencia a evitar los métodos virtuales públicos. El problema al que se enfrenta es diferente: no puede extender una clase que no fue diseñada para ser extendida. –
Apoyo fuertemente las interfaces no virtuales. El uso de métodos públicos 'virtuales' es similar a devolver los controles a sus partes internas -> es un No-No. –