Sto cercando di implementare una suite di tipi di punti utilizzati in GIS, che sono 2D (xy), 3D (xyz o xym) o 4D (xyzm). La coordinata M è una coordinata della misura e le altre dovrebbero essere ovvie. Tuttavia, non riesco a capire come rendere la classe condivide i membri x
e dalla classe Point
. Qui è il mio codice:Polymorphism in C++ con ereditarietà condivisa
#include <iostream>
class Point {
public:
double x, y;
Point (double xNew, double yNew) : x(xNew), y(yNew) {};
};
class PointZ : public Point {
public:
double z;
PointZ (double xNew, double yNew, double zNew) :
Point(xNew, yNew), z(zNew) {};
};
class PointM : public Point {
public:
double m;
PointM (double xNew, double yNew, double mNew) :
Point(xNew, yNew), m(mNew) {};
};
class PointZM : public PointZ, public PointM {
public:
PointZM (double xNew, double yNew, double zNew, double mNew) :
PointZ(xNew, yNew, zNew), PointM(xNew, yNew, mNew) {};
};
int main() {
Point p (1, 2);
PointZ pZ (1, 2, 3);
PointM pM (1, 2, 4);
PointZM pZM (1, 2, 3, 4);
std::cout << "Point: " << sizeof(p) << std::endl;
std::cout << "PointZ: " << sizeof(pZ) << std::endl;
std::cout << "PointM: " << sizeof(pM) << std::endl;
std::cout << "PointZM: " << sizeof(pZM) << std::endl;
}
di stampare le dimensioni delle quattro istanze di ogni classe:
Point: 16
PointZ: 24
PointM: 24
PointZM: 48
mi aspettavo l'ultimo PointZM
essere 32 byte, come avrebbe dovuto x
, y
, z
e m
membri. Come posso ottenere le due classi ereditate PointZ
e PointM
per condividere i membri ereditati Point
? È il modo di ottenere l'unione di due classi? Sono un novizio in C++ con questo argomento.
La motivazione sul perché disturbarsi con l'ereditarietà non è evidente con le geometrie dei punti semplici. Tuttavia, quando si sviluppano ulteriori tipi di geometria, come LineString
(2D), LineStringZ
(3D), LineStringM
(3D) o LineStringZM
(4D), avrebbero un metodo length
che sarebbe diverso se esistesse una dimensione Z. Il metodo di lunghezza verrebbe calcolato in modo diverso solo se esiste una dimensione Z e non vorrei raddoppiare gli sforzi per aggiungere questo alle classi LineStringZ
e LineStringZM
.
'PointZM' ha due istanze' Punto'. Ad ogni modo, l'ereditarietà non sembra proprio qui. Non direi un punto 4D * è un punto * 2D. – juanchopanza
Controlla le classi di base virtuali; ma l'ereditarietà qui non è probabilmente una buona idea. –
I modelli di classe potrebbero essere un'idea migliore qui? Di nuovo, sono un novizio in questo territorio. – user3985527