Benutzer mit den meisten Antworten
Optimierung für den/die Konstruktor/-en (C++ Visual Studio 2012)

Frage
-
Hallo liebe Community, bin grade am lernen von C++ und hab grade die mehrfache Vererbung abgeschlossen. In dem Listing aus dem Buch gab es 2 Klassen und eine Klasse, die von den Beiden erbt (CJaeger, CMinenleger...von diesen beiden erbt CHybrid (Sollen Raumschiffe darstellen :D))
Hier zu meiner Frage:
class CJaeger { public: CJaeger(); virtual ~CJaeger(); virtual void ZeigeMunition(); void Feuern(); protected: int m_Raketen; }; class CMinenleger { public: CMinenleger(); virtual ~CMinenleger(); virtual void ZeigeMunition(); void LegeMine(); protected: int m_Minen; }; class CHybrid : public CJaeger, public CMinenleger { public: CHybrid(); ~CHybrid(); void WaffenAbfeuern(); void ZeigeMunition(); };
Wenn ich nun ein Hybrid erstelle, dann werden die beiden Konstruktoren von CMinenleger und CJaeger ebenfalls aufgerufen, jedoch möchte ich dies garnicht, ich möchte lediglich ein CHybrid erstellen. Wenn ich versuche die beiden Konstruktoren virtual zu setzen, dann funktioniert dies nicht. Hat jemand von euch ne Lösung?
Der Code an sich ist ja garnicht falsch, ist genau so wie im Buch jedoch möchte ich ihn optimieren :)
LG Eizo :)
Antworten
-
Die beiden Konstruktoren müsen aufgerufen werden, damit sichergestellt ist, dass die drunterliegende Klasse bereit ist.
Das einzige was du machen könntest, wäre den Konstrutkor explizit aufzurufen, damit du keine "Nebenwirkungen" hast.
© 2015 Thomas Roskop
Germany // Deutschland
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 24. Februar 2015 10:57
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 3. März 2015 07:36
-
Hallo,
wie Thomas schon geschrieben hat, wird der Konstruktor jeder Basisklasse aufgerufen. Das ist eines der Grundkonzepte der Objektorientiertheit.Ich wüsste aber auch nicht wo da das Problem liegt. Durch den Konstruktor werden beispielsweise die Variablen mit initialen Werten befüllt usw. Würdest du die Basisklassen Konstruktoren nun nicht aufrufen, müsstest du das alles nochmal im Konstruktor der Kind Klasse tun. Das der Aufruf der Basis-Konstruktoren verpflichtend ist erspart somit dir Arbeit.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 24. Februar 2015 10:57
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 3. März 2015 07:42
Alle Antworten
-
Die beiden Konstruktoren müsen aufgerufen werden, damit sichergestellt ist, dass die drunterliegende Klasse bereit ist.
Das einzige was du machen könntest, wäre den Konstrutkor explizit aufzurufen, damit du keine "Nebenwirkungen" hast.
© 2015 Thomas Roskop
Germany // Deutschland
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 24. Februar 2015 10:57
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 3. März 2015 07:36
-
Naja ich hab so oder so das Problem, dass wenn ich schreibe das es ne Instanz von Hybrid gibt, die beiden Konstruktoren aufgerufen werden. Gibt es denn dafür keine Lösung ? Dürfte ich dann die Hybrid-Klasse nicht von den anderen beiden erben lassen, wenn es mein Ziel ist, dass nur dessen Konstruktor aufgerufen wird?
-
Hallo,
wie Thomas schon geschrieben hat, wird der Konstruktor jeder Basisklasse aufgerufen. Das ist eines der Grundkonzepte der Objektorientiertheit.Ich wüsste aber auch nicht wo da das Problem liegt. Durch den Konstruktor werden beispielsweise die Variablen mit initialen Werten befüllt usw. Würdest du die Basisklassen Konstruktoren nun nicht aufrufen, müsstest du das alles nochmal im Konstruktor der Kind Klasse tun. Das der Aufruf der Basis-Konstruktoren verpflichtend ist erspart somit dir Arbeit.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 24. Februar 2015 10:57
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 3. März 2015 07:42
-
Es gibt schon einen klinen Workarround:
class CJaeger { public: CJaeger(); //Normaler Konstruktor - macht normales protected: //oder auch public? CJeager(int i); //Ein alternativer ..ctor zum erstellen - macht rein garnichts! // // ----- // Ähnliches bei der anderen Klasse // class CHybrid : public CJeager, public CMinenleger { public: CHybrid() : CJeager(1), CMinenleger(1); //Aufrufen der alternativen Konstrutkoren statt der standartkonstrukoren
© 2015 Thomas Roskop
Germany // Deutschland
-
Wobei das natürlich auch nur eine Überladung des Konstruktors ist. Je nachdem was dein jetziger, parameterloser Konstruktor macht, bringt dir das nur einen weiteren, nutzlosen Konstruktor.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets