我正在尋找在GIS中使用的一組點類型,它們是2D(xy),3D(xyz或xym)或4D(xyzm)。 M座標是度量座標,其他座標應該是顯而易見的。但是,我似乎無法弄清楚如何使PointZM
類共享Point
類中的x
和y
成員。這裏是我的代碼:共享繼承C++中的多態性
#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;
}
打印每個類的四個實例的大小:
Point: 16
PointZ: 24
PointM: 24
PointZM: 48
我期待最後PointZM
爲32個字節,因爲它應該有x
,y
,z
和m
成員。我怎麼能得到兩個繼承類PointZ
和PointM
分享他們繼承的Point
成員?有兩種方法可以獲得兩個類的聯合嗎?我是這個主題的C++新手。
爲什麼要打擾繼承的動機是不明顯的簡單點幾何。但是,如果進一步開發不同的幾何類型,如LineString
(2D),LineStringZ
(3D),LineStringM
(3D)或LineStringZM
(4D),則它們將具有如果存在Z維度則會不同的幾何類型。只有存在Z維度時,長度方法纔會有不同的計算方法,我不想將其加倍到LineStringZ
和LineStringZM
類別。
'PointZM'有兩個'Point'實例。無論如何,繼承在這裏看起來不正確。我不會說4D點*是-A * 2D點。 – juanchopanza 2014-08-28 06:44:00
查看虛擬基類;但在這裏誠實地繼承可能不是一個好主意。 – 2014-08-28 06:44:29
這裏的課堂模板會更好嗎?再次,我是這個領域的新手。 – user3985527 2014-08-28 06:45:08