Polymorphismus in C ++ mit gemeinsamer Vererbung

8

Ich bin dabei, eine Reihe von Punkttypen zu implementieren, die in GIS verwendet werden und entweder 2D (xy), 3D (xyz oder xym) oder 4D (xyzm) sind. Die M-Koordinate ist eine Maßkoordinate und die anderen sollten offensichtlich sein. Ich kann jedoch nicht herausfinden, wie die PointZM -Klasse die x und y -Member von der Point -Klasse freigeben kann. Hier ist mein Code:

%Vor%

Druckt die Größe der vier Instanzen jeder Klasse:

%Vor%

Ich habe erwartet, dass die letzte PointZM 32 Bytes ist, da sie x , y , z und m Mitglieder haben sollte. Wie kann ich die beiden geerbten Klassen PointZ und PointM erhalten, um ihre geerbten Point -Members zu teilen? Ist das ein Weg, die Vereinigung von zwei Klassen zu bekommen? Ich bin ein C ++ Neuling mit diesem Thema.

Die Motivation, sich mit Vererbung zu beschäftigen, ist bei einfachen Punktgeometrien nicht offensichtlich. Wenn Sie jedoch verschiedene Geometrietypen weiterentwickeln, wie LineString (2D), LineStringZ (3D), LineStringM (3D) oder LineStringZM (4D), hätten sie eine length -Methode, die anders wäre wenn es eine Z-Dimension gäbe. Die Längenmethode würde nur dann anders berechnet, wenn es eine Z-Dimension gibt, und ich möchte die Bemühungen, diese zu den Klassen LineStringZ und LineStringZM hinzuzufügen, nicht verdoppeln.

    
user3985527 28.08.2014, 06:40
quelle

2 Antworten

4

Die direkte Antwort auf Ihre Frage ist die virtuelle Vererbung . Dies würde dazu führen, dass PointZM nur einen Punkt statt zwei enthält. Sie könnten später entscheiden, dass dies die Komplexität nicht wert ist, und stattdessen PointZ, PointM und PointZM separat implementieren, aber das liegt an Ihnen.

Auf meinem System fügt die virtuelle Vererbung jedem virtuell abgeleiteten Typ 8 Bytes hinzu, und PointZM behält die gleiche Größe, weil die 16 Bytes des zusätzlichen Punkts entfernt werden, aber wir haben jetzt zwei zusätzliche Zeiger für die virtuellen Basisklassen gespeichert . Also sehen die Größen so aus:

%Vor%     
John Zwinck 28.08.2014, 06:59
quelle
5

Es gibt 2D-Geometrie, 3D-Geometrie und 4D-Geometrie. 3D-Geometrie ist keine verfeinerte 2D-Geometrie, sondern ein völlig anderes Biest. Ebenso ist die 4D-Geometrie kein Spezialfall der 3D-Geometrie.

Öffentliche Vererbung soll die is-a Beziehung ausdrücken. Es gibt keine solche Beziehung zwischen unterschiedlich dimensionierten Geometrien.

Nicht öffentliche Vererbung kann für die Code-Freigabe verwendet werden, aber es ist nicht klar, welcher Code zwischen 2D-, 3D- und 4D-Fällen geteilt werden kann.

Allerdings sind alle diese Geometrien Fälle von generischer N-dimensionaler Geometrie , wobei N ein Parameter ist. Es wäre natürlich, dies mit einer Klassenvorlage zu modellieren.

%Vor%     
n.m. 28.08.2014 08:23
quelle

Tags und Links