Angenommen, wir haben eine Vorlagenklasse Area
mit einer Mitgliedsvariablen T area
, einer T getArea()
und einer void setArea(T)
Mitgliedsfunktion.
Ich kann ein Area
Objekt eines bestimmten Typs durch Eingabe erstellen Area<int>
.
Jetzt habe ich eine Klasse Rectangle
, die die Area
Klasse erbt . Da es Rectangle
sich nicht um eine Vorlage handelt, kann ich nicht tippen Rectangle<int>
.
Wie spezialisiere ich den geerbten Area
Typ für Rectangle
Objekte?
EDIT: Entschuldigung, ich habe vergessen zu klären - meine Frage ist, ob es möglich ist, Area zu erben, ohne es zu spezialisieren, so dass es nicht als Area of Ints geerbt wird, sondern als Area Rectangle die Typen für spezialisieren kann.
c++
templates
inheritance
dtech
quelle
quelle
Antworten:
Für das Verständnis von Vorlagen ist es von großem Vorteil, die Terminologie klar zu formulieren, da die Art und Weise, wie Sie über sie sprechen, die Art und Weise bestimmt, wie Sie über sie nachdenken.
Insbesondere
Area
handelt es sich nicht um eine Vorlagenklasse, sondern um eine Klassenvorlage. Das heißt, es ist eine Vorlage, aus der Klassen generiert werden können.Area<int>
ist eine solche Klasse (es ist kein Objekt, aber natürlich können Sie ein Objekt aus dieser Klasse auf die gleiche Weise erstellen, wie Sie Objekte aus einer anderen Klasse erstellen können). Eine andere solche Klasse wäreArea<char>
. Beachten Sie, dass dies völlig unterschiedliche Klassen sind, die nichts gemeinsam haben, außer der Tatsache, dass sie aus derselben Klassenvorlage generiert wurden.Da
Area
es sich nicht um eine Klasse handelt, können Sie die Klasse nicht daraus ableitenRectangle
. Sie können eine Klasse nur von einer anderen Klasse (oder mehreren von ihnen) ableiten. DaArea<int>
es sich um eine Klasse handelt, können Sie beispielsweise daraus ableitenRectangle
:Da
Area<int>
undArea<char>
verschiedene Klassen sind, können Sie sogar gleichzeitig von beiden ableiten (wenn Sie jedoch auf Mitglieder zugreifen, müssen Sie sich mit Mehrdeutigkeiten auseinandersetzen):Sie müssen jedoch angeben, von welcher Klasse Sie beim Definieren ableiten möchten
Rectangle
. Dies gilt unabhängig davon, ob diese Klassen aus einer Vorlage generiert werden oder nicht. Zwei Objekte derselben Klasse können einfach keine unterschiedlichen Vererbungshierarchien haben.Sie können auch
Rectangle
eine Vorlage erstellen. Wenn du schreibstSie haben eine Vorlage,
Rectangle
von der Sie eine Klasse erhalten können, vonRectangle<int>
der abgeleitet wirdArea<int>
, und eine andere Klasse, vonRectangle<char>
der abgeleitet wirdArea<char>
.Es kann sein, dass Sie einen einzelnen Typ haben möchten,
Rectangle
damit Sie alle möglichenRectangle
Funktionen an dieselbe Funktion übergeben können (die selbst den Bereichstyp nicht kennen muss). Da dieRectangle<T>
durch das Instanziieren der Vorlage generierten KlassenRectangle
formal unabhängig voneinander sind, funktioniert dies nicht. Sie können hier jedoch die Mehrfachvererbung verwenden:Wenn es wichtig ist, dass Ihr Generikum
Rectangle
von einem Generikum abgeleitet istArea
, können Sie den gleichen Trick auch mit folgenden MethodenArea
ausführen:quelle
Versuchen Sie nur abzuleiten
Area<int>
? In welchem Fall tun Sie dies:BEARBEITEN: Nach der Klarstellung scheint es, dass Sie tatsächlich auch versuchen,
Rectangle
eine Vorlage zu erstellen. In diesem Fall sollte Folgendes funktionieren:quelle
quelle
Machen Sie Rectangle zu einer Vorlage und geben Sie den Typnamen an Area weiter:
quelle
Rectangle
muss eine Vorlage sein, sonst ist es nur ein Typ . Es kann keine Nicht-Vorlage sein, solange seine Basis magisch ist. (Die Basis kann eine Vorlage sein Instanziierung , wenn Sie scheinen zu wollen , die Basis der Funktionalität aufrecht zu erhalten als Vorlage .)quelle
quelle