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 |