Also heißt es, dass ich um eine Deklaration in jeder Klasse nicht umhin komm? Denn die Methoden haben ja nicht den gleichen Inhalt, sie heißen nur gleich.
Danke für die bisherigen Antworten.
Ja, du musst explizit sagen, was du überschreibst, was nicht. Ich habe hier mal ein kleines Beispiel, was sonst nicht funktioniert. Wichtig zu beachten ist, wenn dein Projekt auf mehrere Dateien aufgeteilt ist, was häufig der Fall sein wird, wird der Compiler typischerweise von den meisten Klassen nur die Deklarationen kennen.
Nehmen wir an, wir haben einige Klassen, die verschiedene Varianten einer Liste implementieren sollen. Natürlich möchte man die Listenimplementationen schnell austauschen können, also macht man ein Interface IList:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
|
class IList
{
public:
virtual ~IList ();
virtual void Add (...) = 0;
virtual void Remove (...) = 0;
...
virtual void QuickSort (...) = 0;
}
|
Das soll jetzt nur ein Beispiel sein.
Den Quicksort Algorithmus wird man nur einmal implementieren wollen, der ist ja eigentlich unabhängig von der Liste. Also machen wir eine Klasse, die nur den implementiert!
|
C-/C++-Quelltext
|
1
2
3
4
5
6
|
class AbstractList : public IList
{
public:
virtual ~AbstractList ();
virtual QuickSort (...);
}
|
So, ich habe explizit angegeben, dass AbstractList die Methode QuickSort implementiert. Damit ist die Klasse aber immer noch abstrakt, d.h. ich kann keine Instanz von ihr anlegen. Add und Remove sind ja nach wie vor nicht implementiert. Also kommen nun die verschiedenen Implementationen.
|
C-/C++-Quelltext
|
1
2
3
4
5
|
class DoubleLinkedList : public AbstractList
{
...
}
etc.
|
Und da dein Compiler eigentlich nur die Implementationen zur Analyse zur Verfügung hat, wenn er gerade die cpp-Dateien dieser Klasse kompiliert, musst du noch mal explizit angeben was deine Klasse nun wirklich implementiert, damit der Compiler sagen kann, dass DoubleLinkedList instanziert werden kann und AbstractList nicht. Und IList sowieso nicht.