2011-01-06 16 views
3
 Class One : public Two 
     { 
     public: 
      One() 
      { 
       Three three; 
       cout << "something"; 
      } 
     private: 
      Four _four; 
     }; 

Ich muss einen Satz anzeigen: "Eins Zwei Drei Vier Fünf Sechs Sechs Sieben" und Klasse Eins müssen so bleiben wie es ist. Jede Klasse kann nicht mehr als ein Wort in ihrem Konstruktor und Destruktor anzeigen.C++ - Vererbung

Also ... ich habe herausgefunden, dass meine Basisklasse Klasse vier ist. Ich habe auch konstruiert. & destr. in jeder Klasse und versucht, etwas in ihrem Körper zu schreiben, aber das ist, was ive auf Ausgang bekam:

Class Four Constructor: 
Class Three Constructor: 
Class Two Constructor: 
Class Four Constructor: 
Class Four Constructor: 
Class Three Constructor: 
Class One Constructor: 
Class Three Destructor: 
Class Four Destructor: 

DESTRUCTION: 
Class One Destructor: 
Class Four Destructor: 
Class Two Destructor: 
Class Three Destructor: 
Class Four Destructor: 

meine Hauptfunktion:

int main() 
{ 
One one; //<---- it also have to remain 
cout << endl; 
cout << "DESTRUCTION:\n"; 
} 

ich ein paar Artikel über die Vererbung gelesen haben, aber immer noch nicht Idee, Wörter in Klassen anzuzeigen & Destruktoren, aber tun Sie es nicht zweimal oder öfter, auch wenn ich Objekte dieser Klassen wie in Klasse eins erstelle.

PS Sorry für gramma und andere Fehler;)

+1

* "etwas" * nicht in der Ausgabe angezeigt wird - Was soll man haben anstatt "cout <<" etwas "' in der "echten" Übung? Und muss * "Eins Zwei Drei Vier Fünf Sechs Sechs Sieben" vor * "ZERSTÖRUNG:" * in der Ausgabe erscheinen? Und können Sie mehr Klassen als die oben genannten 4 verwenden? –

+0

"etwas" sollte wie "Klasse vier Konstruktor: ONE", "Class One Destructor: SIX" etc. aussehen. "DESTRUCTION" kann gelöscht werden, ich habe es erstellt, um zu sehen, was los ist;) und ich muss sie nur anzeigen , egal wo – mctl87

+0

Können Sie bitte Ihre Frage bearbeiten, um die korrekte, genaue Definition der Klasse Eins einzuschließen. Ich kann nicht herausfinden, was Sie von Ihrem Kommentar erreichen möchten und das Lösen Ihrer Frage ist derzeit nicht möglich, da "cout <<" etwas " – Mic

Antwort

4

Was wir ableiten können, beruht allein auf der bekannten Definition von One (und meine Erinnerung an C++ Konstruktionsregeln, die nicht zu 100% korrekt :-) sein kann, nicht unter Berücksichtigung aller weiteren möglichen Vererbungsbeziehungen zwischen den Klassen:

  1. die Ausgabe von Two() (die Basisklassenkonstruktor ist) vor dem Ausgang aller anderen Konstrukteuren kommt,
  2. die Ausgabe von Four() (Zugehörigkeit auf ein Mitglied der Klasse abgeleitet),
  3. nächsten kommt, dann ist der Ausgang des Three() (lokales Objekt innerhalb des One() Konstruktor) selbst, der Ausgang des One()
  4. dann
  5. dann der Ausgang des ~Three() (wobei lokale Variable, es geht aus dem Geltungsbereich bei der Rückkehr von One()).

Und hier haben wir unsere glänzenden One Objekt konstruiert. Da wir nicht viel damit machen können, wollen wir es zerstören! Beachten Sie, dass alle Objekte genau im Gegensatz zu ihrer Konstruktionsreihenfolge zerstört werden; Dies ist eine grundlegende C++ Regel. So

  1. Zuerst kommt die Ausgabe von ~Four() (da Mitglieder vor ihrem Besitzer zerstört werden),
  2. (dann würde die Ausgabe der nicht vorhandenen ~One(), wie der abgeleitete Anteil der Klasse vor seinem Basisteil zerstört wird),
  3. dann ist die Ausgabe von ~Two() als Basisteil zuletzt zerstört.

Dies gibt Ihnen genau sieben mögliche Zahlen zur Ausgabe, so dass Sie keine zusätzlichen Basisklassen oder Mitglieder benötigen. Setzen Sie einfach die richtigen Zahlen in die Ausgabe der rechten Konstruktoren & destructors :-)

0

Sie versuchen wahrscheinlich, die Reihenfolge herauszufinden, in der Konstruktoren aufgerufen werden. Wenn Sie einen Konstruktor aufrufen, wird zuerst der Konstruktor der Superklasse ausgeführt (Beachten Sie, dass ich mit Java besser zurechtkomme als mit C++, seien Sie also vorsichtig).Wenn One von Two erbt, der von Three erbt, und Sie den Konstruktor von One aufrufen, lautet die Reihenfolge: Three, Two, One.

1

Sie haben dies als Hausaufgaben markiert, so dass ich Ihnen die Antwort nicht gehen sagen ...

Diese Übung scheint zu helfen Sie den Auftrag verstehen, angestrebt zu werden, in denen Konstruktoren und Destruktoren aufgerufen werden. Da Sie nur Klassenvererbung verwenden können, Membervariablen, Konstruktoren und Destruktoren, sind sie die einzigen Mechanismen für Programmablauf zu bestimmen und damit die Reihenfolge der Ausgabe

Einige Fragen:

  • , die ihr Körper zuerst ausgeführt hat, ein abgeleiteter Klassenkonstruktor oder eine Basis Klassenkonstruktor? Was ist mit Destruktoren?
  • Wird der Konstruktor für ein Element Variable vor dem Konstruktor für die enthaltene Klasse ausgeführt? Was ist mit den Destruktoren?

Ich schlage vor, mit einem einfachen Beispiel zu beginnen. Zwei Klassen, jeweils mit einem Konstruktor und einem Destruktor, einer von dem anderen. Drucken Sie etwas in jeder Funktion und schauen Sie sich die Reihenfolge an. Fügen Sie dann eine weitere Klasse hinzu und machen Sie sie zu einer Mitgliedsvariablen. Was geschieht?

Da Sie eine ungerade Anzahl von Wörtern ausgeben müssen, muss eine Klasse nur in ihrem Konstruktor oder Destruktor, aber nicht in beiden ausgeben.

Btw, in Ihrer Frage Klasse Vier ist nicht die Basisklasse.

Viel Glück!

0

Auch das verstehen -

Von Standard-docs, Löschen,

Bei der ersten Alternative (Objekt löschen), wenn der statische Typ des Operanden unterscheidet von seinem dynamischen Typ, die statische type muss eine Basisklasse des dynamischen Typs des Operanden sein und der statische Typ muss einen virtuellen Destruktor haben oder das Verhalten ist nicht definiert.

1

Ok es gemacht wird:] Vielen Dank für Ihre Antworten, vor allem Péter Török :)

class Two 
{ 
public: 
    Two() 
    { 
     cout << "Class Two Constructor: ONE" << endl; 
    } 
    ~Two() 
    { 
     cout << "Class Two Destructor:" << endl; 
    } 
}; 

class Three 
{ 
public: 
    Three() 
    { 
     cout << "Class Three Constructor: THREE" << endl; 
    } 
    ~Three() 
    { 
     cout << "Class Three Destructor: FIVE" << endl; 
    } 
}; 

class Four 
{ 
public: 
    Four() 
    { 
     cout << "Class Four Constructor: TWO" << endl; 
    } 
    ~Four() 
    { 
     cout << "Class Four Destructor: SEVEN" << endl; 
    } 
}; 


class One: public Two 
{ 
public: 
    One() 
    { 
     Three Three; 
     cout << "Class One Constructor: FOUR" << endl; 
    } 
    ~One() 
    { 
     cout << "Class One Destructor: SIX" << endl; 
    } 
private: 
    Four _Four; 
}; 

und Ausgang:

Class Two Constructor: ONE 
Class Four Constructor: TWO 
Class Three Constructor: THREE 
Class One Constructor: FOUR 
Class Three Destructor: FIVE 

DESTRUCTION: 
Class One Destructor: SIX 
Class Four Destructor: SEVEN 
Class Two Destructor: