Ich erweitere eine Klasse von einer dritten Teilbibliothek zur Verfügung gestellt. Die Klasse, nennen wir sie Foo
, hat eine reset()
Methode, die aufgerufen werden kann, um das Verhalten von Foo
neu zu starten. Die Methode reset()
wird auch intern von der Klasse verwendet.Erzwingen Methoden Dritter Virtualität
class Foo
{
public:
void reset() {
/* ... */
}
void something() {
reset();
}
};
Bisher muss ich die reset()
Methode, um zu überlasten meine zusätzliche Funktionen wie auch zurück:
class Bar : public Foo
{
public:
void reset() {
/* ...something... */
Foo::reset();
}
};
Leider, da die Foo::reset()
Methode ist nicht virtuell, durch Bar::something()
Aufruf ich das bekommen Foo::reset()
Methode aufgerufen anstelle von Bar::reset()
.
Gibt es einen Weg (anders als das Überladen Foo::something()
), um es rückwärts-virtuell zu machen?
Übrigens habe ich auf diese Weise gelernt, jede Methode, die sowohl öffentlich als auch intern verwendet wird, als virtuell zu setzen. – Dacav
Das ist eine schlechte Entscheidung, google für NVI und Sie werden einen Trend zur Vermeidung von öffentlichen virtuellen Methoden sehen. Das Problem, mit dem Sie konfrontiert sind, ist anders: Sie können keine Klasse erweitern, die nicht erweitert wurde. –
Ich unterstütze stark Non Virtual Interfaces. Die Verwendung von 'virtuellen' öffentlichen Methoden ähnelt der Rückgabe von Handles an Ihre Interna -> es ist ein Nein-Nein. –