Lassen Sie uns zunächst darüber nachdenken, warum Sie überhaupt eine Basisklasse haben möchten. Ich kann mir ein paar verschiedene Gründe vorstellen:
- Unterstützung generischer Operationen oder Sammlungen, die für Objekte eines beliebigen Typs geeignet sind.
- Um verschiedene Verfahren einzuschließen, die allen Objekten gemeinsam sind (z. B. Speicherverwaltung).
- Alles ist ein Objekt (keine Grundelemente!). Einige Sprachen (wie Objective-C) haben dies nicht, was die Dinge ziemlich chaotisch macht.
Dies sind die beiden guten Gründe, warum Sprachen der Marken Smalltalk, Ruby und Objective-C Basisklassen haben (technisch gesehen hat Objective-C keine Basisklasse, aber in jeder Hinsicht).
Für # 1 wird die Notwendigkeit einer Basisklasse, die alle Objekte unter einer einzigen Schnittstelle vereint, durch die Aufnahme von Vorlagen in C ++ vermieden. Zum Beispiel:
void somethingGeneric(Base);
Derived object;
somethingGeneric(object);
ist unnötig, wenn Sie die Typintegrität durch parametrischen Polymorphismus vollständig aufrechterhalten können!
template <class T>
void somethingGeneric(T);
Derived object;
somethingGeneric(object);
Während in Objective-C Speicherverwaltungsprozeduren Teil der Implementierung einer Klasse sind und von der Basisklasse geerbt werden, wird die Speicherverwaltung in C ++ eher durch Komposition als durch Vererbung durchgeführt. Sie können beispielsweise einen Smart Pointer Wrapper definieren, der die Referenzzählung für Objekte eines beliebigen Typs durchführt:
template <class T>
struct refcounted
{
refcounted(T* object) : _object(object), _count(0) {}
T* operator->() { return _object; }
operator T*() { return _object; }
void retain() { ++_count; }
void release()
{
if (--_count == 0) { delete _object; }
}
private:
T* _object;
int _count;
};
Anstatt Methoden für das Objekt selbst aufzurufen, würden Sie dann Methoden in seinem Wrapper aufrufen. Dies ermöglicht nicht nur eine allgemeinere Programmierung, sondern ermöglicht es Ihnen auch, Bedenken zu trennen (da Ihr Objekt im Idealfall mehr darüber nachdenken sollte, was es tun sollte, als darüber, wie sein Speicher in verschiedenen Situationen verwaltet werden sollte).
Schließlich in einer Sprache, die sowohl Grundelemente als auch tatsächliche Objekte wie C ++ enthält, die Vorteile einer Basisklasse (eine konsistente Schnittstelle für alle Wert) verloren, da Sie dann bestimmte Werte haben, die dieser Schnittstelle nicht entsprechen können. Um Primitive in einer solchen Situation zu verwenden, müssen Sie sie in Objekte heben (wenn Ihr Compiler dies nicht automatisch tut). Dies verursacht viele Komplikationen.
Die kurze Antwort auf Ihre Frage: C ++ hat keine Basisklasse, da dies aufgrund des parametrischen Polymorphismus durch Vorlagen nicht erforderlich ist.