Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

killmichnich

unregistriert

1

15.08.2009, 15:52

Konstruktor mit Vererbung

Hiho,
ich hab ne Frage bezüglich des Konstruktors bzw. Destruktors und der Vererbung.
Angenommen ich habe 2 Klassen A und B, wobei B von A erbt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
class A
{
   public: 
   A();
   ~A();
};

class B : public A
{
   public:
   B();
   ~B();
};

Wird dann wenn ich ein Objekt der Klasse B erzeuge auch der Konstruktor der Klasse A aufgerufen, oder muss ich den für B ganz neu schreiben?

MfG Killmichnich

2

15.08.2009, 15:57

Hallo

Probier es doch einfach mal aus....

chrische

killmichnich

unregistriert

3

15.08.2009, 16:03

lol auf die Idee bin ich jetz garnich gekommen oO
Ich glaub die Ferien tun mir nich gut ...

Ok er wird aufgerufen ... Thx =)

4

15.08.2009, 16:08

Du den Basisklassenkonstruktor allerdings explizit in der Initialisierungsliste aufrufen, falls es sich nicht um einen Standardkonstruktor handelt.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
class A 
{ 
   public: 
       A(int, const char*); 
}; 

class B : public B 
{ 
   public: 
       B(const char* str) : A(4, str) {}
};

5

15.08.2009, 16:51

das das niemanden auffält das die klasse b von b erbt oO

6

15.08.2009, 23:40

lol. bin leider zu spät aber wollte auch grad sagen. b erbt von sich selbst...

und zur konsturktorensache is eh schon alles gesagt. du muss in der initialisierungsliste den konstruktor der basisklasse aufrufen. und destruktor der basisklasse würde ich virtual machen.

lg aly

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

16.08.2009, 00:00

Zitat von »"AlymcGeel"«

und zur konsturktorensache is eh schon alles gesagt. du muss in der initialisierungsliste den konstruktor der basisklasse aufrufen. und destruktor der basisklasse würde ich virtual machen.


In der Initialisierungsliste musst du den natürlich nur aufrufen wenn es keinen Default Ctor gibt oder du einen anderen als den Default Ctor verwenden willst.

8

16.08.2009, 00:36

ja klar. da hast du recht.

9

16.08.2009, 01:05

Zitat von »"AlymcGeel"«

und destruktor der basisklasse würde ich virtual machen.
Würde ich nicht a priori, nur weil Vererbung im Spiel ist. Sinnvoll ist das schliesslich nur, wenn man polymorphes Verhalten erzielen möchte, also wenn über Basisklassenzeiger/-referenzen virtuelle Funktionen der abgeleiteten Klassen aufgerufen werden sollen.

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

10

16.08.2009, 09:30

Zitat von »"Nexus"«

Zitat von »"AlymcGeel"«

und destruktor der basisklasse würde ich virtual machen.
Würde ich nicht a priori, nur weil Vererbung im Spiel ist. Sinnvoll ist das schliesslich nur, wenn man polymorphes Verhalten erzielen möchte, also wenn über Basisklassenzeiger/-referenzen virtuelle Funktionen der abgeleiteten Klassen aufgerufen werden sollen.

Ich dachte es ist nötig Destruktoren in Klassenhierachien virtuell zu definieren, da diese sonst evtl nicht alle aufgerufen werden.

Zum Zeitpunkt des Destruktoraufrufs ohne nicht erkennbar ist ob bei
B* instance = new B();
delete (A*)instance;
auch der Destruktor von B aufgerufen werden soll.

Im allgemeinen würde ich "virtual" auch nicht davon abhängig machen ob die Methoden auch über Basisklassenzeiger aufgerufen werden sollen, sondern ob sie von der ableitenden Klasse überschrieben werden sollen. Alles andere fürt bei eventuellen Refactorings (Wenn man dann doch mal den Basisklassenzeiger verwendet) zu unerwartetem verhalten und erzeugt Fehler die schwierig zu finden sind.

Kann man natürlich handhaben wie man will, aber ich persönlich möchte bei der Nutzung der Klasse nicht darauf achten welche Methoden ich jetzt virtual gemacht habe und welche nicht.

Werbeanzeige