Aufruf der abgeleiteten Klasse die Funktion aus der Basisklasse
class base
{
public:
virtual void start();
virtual void stop();
void doSomething() { start(); .... stop(); }
}
class derived : public base
{
public:
void start();
void stop();
}
Aber wenn ich rufe doSomething()
in der abgeleiteten Klasse ist es unter Verwendung Ihrer eigenen definition von Start()
und Stop()
- nicht abgeleitet lieben.
Will ich nicht umschreiben doSomething()
in der abgeleiteten Klasse, denn es wäre identisch mit der base. Was mache ich falsch?
Sorry wenn das nicht klar.
Das Verhalten von Start() und Stop() in der abgeleiteten Klasse anders ist (es ist eine andere Maschine) - aber ich will das original Basis-Klasse doSomething() weil das hat sich nicht verändert. Es muss einfach nur auf start() und stop() mit der neuen abgeleiteten Klasse code.
Natürlich ist es verwendet seine eigene definition; Polymorphismus bei der Arbeit. Ihre Frage ist nicht ganz klar, warum würden Sie nicht wollen, zu nennen, die überschrieben Umsetzung?
Herzlich willkommen auf Stack Overflow. Bitte betrachten Sie die Ausgaben ein wenig mehr Zeit für die Vorbereitung Ihre Frage so, dass es genau zeigt, das Problem, das Sie diskutieren möchten. Das bedeutet, dass die Buchung eine kurze, kompilierbar und ausführbar Beispiel. Wenn es fertig ist, kopieren und einfügen von code-editor in Ihrem browser; nicht versuchen, die Komposition neuer code in Ihrem browser, da wirst du Fehler machen, und es wird nicht klar, der Leser, ob diese Fehler sind wirklich Teil der test-Fall.
Ich glaube, dass er verlängern möchte, Verhalten. In diesem Fall wird in der Implementierung der start() und stop() in der abgeleiteten Klasse aufrufen, Basis::starten(); base::stop(); bzw. und Griff die Besonderheiten, die für abgeleitet. Entweder das, oder anfangen und aufhören, Reine virtuelle und Kapseln das gemeinsame Verhalten in der geschützten Funktionen.
es ist ganz klar nicht zu einem compiler-Fehler, wenn das problem ist, dass es mit der falschen Umsetzung einer Funktion. Das wäre nicht möglich, zu wissen, zur compile-Zeit, also den eigentlichen code muss lauffähig. Aber im Allgemeinen hast du Recht — die Anforderung der post ausführbarer code wird verzichtet, wenn das problem ist, dass es nicht kompilieren.
Sind Sie sicher, dass dieser Satz, sagt, was Sie wollte, es zu sagen: "Aber wenn ich rufe
Herzlich willkommen auf Stack Overflow. Bitte betrachten Sie die Ausgaben ein wenig mehr Zeit für die Vorbereitung Ihre Frage so, dass es genau zeigt, das Problem, das Sie diskutieren möchten. Das bedeutet, dass die Buchung eine kurze, kompilierbar und ausführbar Beispiel. Wenn es fertig ist, kopieren und einfügen von code-editor in Ihrem browser; nicht versuchen, die Komposition neuer code in Ihrem browser, da wirst du Fehler machen, und es wird nicht klar, der Leser, ob diese Fehler sind wirklich Teil der test-Fall.
Ich glaube, dass er verlängern möchte, Verhalten. In diesem Fall wird in der Implementierung der start() und stop() in der abgeleiteten Klasse aufrufen, Basis::starten(); base::stop(); bzw. und Griff die Besonderheiten, die für abgeleitet. Entweder das, oder anfangen und aufhören, Reine virtuelle und Kapseln das gemeinsame Verhalten in der geschützten Funktionen.
es ist ganz klar nicht zu einem compiler-Fehler, wenn das problem ist, dass es mit der falschen Umsetzung einer Funktion. Das wäre nicht möglich, zu wissen, zur compile-Zeit, also den eigentlichen code muss lauffähig. Aber im Allgemeinen hast du Recht — die Anforderung der post ausführbarer code wird verzichtet, wenn das problem ist, dass es nicht kompilieren.
Sind Sie sicher, dass dieser Satz, sagt, was Sie wollte, es zu sagen: "Aber wenn ich rufe
doSomething()
im abgeleiteten Klasse ist es unter Verwendung Ihrer eigenen definition von Start()
und Stop()
- nicht der abgeleitet lieben." [betonen mine]? Denn wenn Sie es tut, weiß ich nicht und verstehe auch nicht, was dein problem ist.InformationsquelleAutor cpp help | 2011-02-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den code, den Sie gepostet habe sollte so funktionieren, wie Sie wollen. Aufruf
doSomething
auf eine Instanz vonderived
aufrufen, die überschriebenstart
undstop
definierten Funktionen inderived
.Gibt es eine Ausnahme, dass, obwohl. Wenn Sie anrufen
doSomething
im Konstruktor oder Destruktorbase
(ob direkt oder indirekt), dann werden die Versionen vonstart
undstop
, die aufgerufen werden, werden diejenigen definiert, die inbase
. Das ist, weil unter diesen Umständen eigentlich nicht haben, eine gültigederived
Instanz noch. Es ist entweder nicht vollständig aufgebaut oder teilweise zerstört, so dass die Sprache verhindert das aufrufen von Methoden, die teilweise Objekt.Wenn Sie nicht nennen es von einem
base
Konstruktor oder Destruktor, dann es ist mehr das problem als das, was hier gezeigt wird.InformationsquelleAutor Rob Kennedy
Update
Basierend auf Ihren Kommentar unten, dass Sie versuchen, zu machen doSomething () - Aufruf der Abgeleiteten Klasse version von start() und stop(), meine aktualisierte Antwort auf Ihre Frage lautet wie folgt:
Es ist nichts falsch mit der Art und Weise, die Sie definiert haben Basis-und Abgeleitete. Sie sind wahrscheinlich zu erleben, was heißt "code-slicing", wo Sie sind Aufruf von "doSomething()" auf ein Objekt, dessen deklarierten Typ ist die "Basis", anstelle von "Basis*" oder "Basis&", wird das Objekt konvertiert, Typ Basis.
Schlechtes Beispiel:
Gutes Beispiel:
Seite-Hinweis: sollten Sie die Verwendung eines scoped_ptr, shared_ptr, unique_ptr, oder einige andere smart-pointer-Klasse statt mit einem Zeiger direkt wie in meinem Beispiel; jedoch nicht darüber hinwegtäuschen, dass das Problem, ich haben sich dafür entschieden, die Verwendung einer raw-Zeiger in diesem Beispiel. Weitere Informationen zu "schneiden", siehe:
Original-Lösung
Sie könnte so etwas tun:
Wenn Sie dies tun, dann doSomething() wird die interne version von start/Stopp-das ist nicht außer Kraft gesetzt. Sie finden dieses Muster eine Menge, wenn ein Konstruktor/Destruktor muss-share-Logik, die mit einer virtuelle Methode.
Auch nicht mit der Frage auf der hand, vergessen Sie nicht, dass Sie sollten immer einen virtuellen Destruktor, wenn Sie erstellen eine Klasse, die virtuelle Methoden.
HINWEIS: Mein Kommentar oben war eine Antwort auf einen gelöschten Kommentar von Marton, die fragte, ob ich das machen soll start() und stop() des virtuellen in der abgeleiteten Klasse auch.
Das ist das Gegenteil von dem, was ich brauchte - ich brauche die base-Klasse doSomething() zu Holen, die abgeleitet start/stop, wenn doSomething() aufgerufen, in der abgeleiteten Klasse.
es ist eine Reine Frage des Stils. Ich bin jetzt daran gewöhnt, mit dem Google C++ style (siehe: google-styleguide.googlecode.com/svn/trunk/...), wo es heißt: "Wenn die Neudefinition eine geerbte virtuelle Funktion, die explizit erklären, virtual in der Deklaration der abgeleiteten Klasse. Begründung: Wenn der virtuelle weggelassen wird, der Leser hat zu prüfen, alle Vorfahren der Klasse in Frage, um festzustellen, wenn die Funktion virtuell ist oder nicht." Ich denke, die Begründung gegeben, die Sinn macht.
oh ok danke, ich war nur neugierig
InformationsquelleAutor Michael Aaron Safyan
Nur erklären, sondern start-und Stopp-Funktionen, die als rein virtuelle Basisklasse.
InformationsquelleAutor Deepak