PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ und Konstruktorketten bei Vererbung


Gast
2008-02-19, 08:48:05
Hi,

ich möchte ein Objekt bauen aus einer Referenz von sich selbst.

class Zonk : public Monk
{
public:
Zonk( const Zonk& obj );
}

Muß ich mich in jeder Implementation um die Belegungen des kompletten Objekts kümmern (inkl. geerbter Member)? Ich würde gern die Konstruktoren der jeweiligen Klassen bemühen. Nur wenn ich ein

class Monk
{
public:
Monk( const Zonk& obj );
}
Konstruktor mit den Implementationen anlege, habe ich in der Superklasse nachher haufenweisen Konstruktoren für die jeweiligen Implementationen, was ich nicht will.

Ich hatte gehofft, daß er beim Aufruf des ersten Konstruktors auch diesen Konstuktor aufrufen würde (Zonk könnte ja auch direkt in Monk gecastet werden)

class Monk
{
public:
Monk( const Monk& obj );
}
Das tut er allerdings nicht - kann ich das aber irgendwie erreichen? Ich gebe eine Referenz von oben rein und die Referenz wird nach unten runter mit dem jeweiligen Typ geleitet, so daß sich jedes Klasse, nur um seine Member kümmern muß und auch nur eine Referenz von sich selbst erhält?

Xmas
2008-02-19, 11:26:54
Du kannst einen Basiskonstruktor explizit in der Initialisierungsliste des Konstruktors aufrufen:
class Zonk : public Monk
{
public:
Zonk(const Zonk& obj) : Monk(obj) //, ... hier kannst du auch Member von Zonk initialisieren
{
// ...
}
};

Neomi
2008-02-19, 11:33:29
Die Initialisierungsliste ist für solche Dinge geeignet. Wenn man nicht explizit einen parametrisierten Konstruktor (ein Copyconstructor ist letztendlich auch nichts anderes) der Basisklasse auswählt, wird implizit der jeweilige Defaultkonstruktor bemüht.

class Zonk : public Monk
{
public:
Zonk(const Zonk& obj) : Monk(obj) // parametrisierten Konstruktor der Basisklasse aufrufen
{
// Zonk-spezifische Member initialisieren
}
};

Gast
2008-02-19, 11:46:56
Ahh, ja klar. Vielen Dank, hätte ich eigentlich auch selber drauf kommen müssen... :)