Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Vorbereitung für c++ Prüfung (Persönliche Fragen)

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
08.09.2006, 17:35 Uhr
enriico



Hallo zusammen

Wir haben an der Fachhochschule bald die c++ Prüfung und nun drängen sich bei mir noch einige Fragen auf! Ich bin mir einfach nicht 100%ig sicher! Bitte gibt auch wirklich nur eine Antwort, wenn ihr ganz genau wisst wovon ihr spricht!


1.Was passiert im Hintergrund, wenn ich zwar einen Konstruktor erstelle jedoch keinen Destruktor? Beim Konstruktor ist mir klar, dass das System einen zur Verfügung stellt,
wie sieht es beim destruktor genau aus?
//es werden keine dynamischen objekte angelegt!

C++:
class foo
{
public:
    foo(int n): number(n) {}
private:
    int number;
};

int main()
{
    foo f(2);
}


2.Falls zwei Elternklassen dieselbe Basisklasse verwenden, existieren in der Subklasse ja zwei anonyme Objekte der Basisklasse. Wieso sind dann virtuelle Basisklassen die Lösung für dieses Problem?



danke für die antwort
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.09.2006, 17:54 Uhr
0xdeadbeef
Gott
(Operator)


Ein Destruktor wird ebenfalls implizit erstellt, allerdings ist der von Haus aus leer, bzw. ruft ggf. den Konstruktor der bekannten Vaterklasse auf. (Merke bekannte Vaterklasse, dazu gleich mehr).

Zu 2., da ist wichtig zu verstehen, was virtuell eigentlich bedeutet. virtual ist in C++ ein Schlüsselwort, das im Grunde bedeutet, dass das, was virtual gemacht wird, nicht direkt benutzt, sondern als Referenz gehalten wird. Beispiel:

C++:
#include <iostream>

class foo {
public:
  void baz() { std::cout << "foo::baz()" << std::endl; }
  virtual void qux() { std::cout << "foo::qux()" << std::endl; }

  virtual ~foo() { std::cout << "foo::~foo()" << std::endl; }
};

class bar : public foo {
public:
  void baz() { std::cout << "bar::baz()" << std::endl; }
  virtual void qux() { std::cout << "bar::qux()" << std::endl; }

  virtual ~bar() { std::cout << "bar::~bar()" << std::endl; }
};

int main() {
  foo *ptr = new bar();

  ptr->baz(); // gibt "foo::baz()" aus
  ptr->qux(); // gibt "bar::qux()" aus

  delete ptr;
}


Der Hintergrund ist, dass baz direkt benutzt wird, d.h. da ptr vom Typ foo* ist, wird foo::baz() aufgerufen, während qux als Referenz gehalten wird, das heißt, der Compiler dereferenziert den Zeiger und nimmt die Funktion, von der in der Klasse drinsteht, dass sie qux ist - und da ptr auf ein Objekt vom Typ bar ist, ist das bar::qux().

Übrigens - wenn dir noch nicht klar ist, warum Destruktoren von beerbbaren Klassen virtuell sein müssen, nimm da oben mal das virtual vor den Destruktornamen weg und sieh, was sich verändert.

OK, in Bezug auf Klassen bedeutet das, dass bei virtueller Vererbung die Klasse nicht mehr die Basisklasse direkt beinhaltet, sondern eine Referenz auf eine Instanz der Basisklasse. Wenn du jetzt von zwei Klassen erbst, die jeweils die selbe Basisklasse virtuell beerben, beinhaltet deine neue Klasse also zwei Referenzen auf ein Objekt der Basisklasse, und die zeigen halt auf das selbe Objekt.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.09.2006, 18:03 Uhr
enriico



herzlichen dank für deine ausführliche antwort. mit deiner erläuterung sind mir nun auch die restlichen fragen klar geworden!

wirklich super erklärung!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: