gpt4 book ai didi

c++ - 具有共享继承的 C++ 中的多态性

转载 作者:可可西里 更新时间:2023-11-01 17:40:30 25 4
gpt4 key购买 nike

我正在考虑实现一套在 GIS 中使用的点类型,它们是 2D (xy)、3D(xyz 或 xym)或 4D (xyzm)。 M坐标是测量坐标,其他的应该是显而易见的。但是,我似乎无法弄清楚如何使 PointZM 类共享 Point< 中的 xy 成员类。这是我的代码:

#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 字节,因为它应该有 xyzm 成员。如何让两个继承类 PointZPointM 共享它们继承的 Point 成员?是获得两个类(class) union 的某种方式吗?我是这个主题的 C++ 新手。

对于简单的点几何图形,为什么要费心继承的动机并不明显。但是,当进一步开发不同的几何类型时,例如 LineString (2D)、LineStringZ (3D)、LineStringM (3D) 或 LineStringZM (4D),他们会有一个 length 方法,如果有 Z 维度,该方法会有所不同。只有存在 Z 维时,长度方法的计算方式才会有所不同,我不想加倍努力将其添加到 LineStringZLineStringZM 类中。

最佳答案

有2D几何、3D几何和4D几何。 3D 几何不是 2D 几何的精炼实例,它是完全不同的野兽。同样,4D 几何不是 3D 几何的特例。

公共(public)继承旨在表达is-a 关系。不同尺寸的几何体之间没有这种关系。

非公有继承可以用于代码共享,但是不清楚2D、3D、4D情况下可以共享什么代码。

但是,所有这些几何都是一般 N 维几何的情况,N 是一个参数。使用类模板对其进行建模是很自然的。

   template <size_t N>
class Point
{
std::array<double, N> coord;
// ... rest of the code ...
};

关于c++ - 具有共享继承的 C++ 中的多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25542297/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com