更新:提问者似乎已从问题中删除了类名。这是编写此答案的原始代码:
class Vector2D { ... };
class Vector3D : public Vector2D {
//...
Vector3D(const Vector2D& b);
Vector3D(const Vector3D& a);
//...
};
我之前说“不”,但我改变了主意。这是模棱两可的,我想不出有充分理由让Vector3D 继承自Vector2D。
从数学的角度来看,2D 向量空间可以扩展到 3D 向量空间,但有许多扩展可供选择——它们不是唯一的。因此,当您创建一个从 2D 向量类继承的 3D 向量类时,您正在使 3D 空间中的 2D 空间的一个嵌入成为“特权”,而所有其他嵌入则处于劣势。我认为这不是特别有用。
您正在做的另一件事是您说“每个 3D 向量都是 2D 向量”,这有点愚蠢。例如,也许你写了一个函数:
// Compute the angle between two vectors
double angle(Vector2D x, Vector2D y);
假设您忘记为 3D 矢量编写版本。现在,编译器将无法给您错误消息:相反,您的 3D 矢量将使用您在创建类时选择的“特权”投影投影到 2D 空间,您将得到错误的答案。现在假设你添加另一个函数:
// Compute the angle between two 3D vectors
double angle(Vector3D x, Vector3D y);
现在,还是有问题。
Vector3D x = ...;
Vector2D y = ...;
double a = angle(x, y);
这将使用 x 的 2D 投影,同样,您不会收到编译器警告。你只会得到错误的答案。
总结:这是最糟糕的歧义:编译器会给你意想不到的答案。
Vector3D 不应继承自 Vector2D。这在数学上是不合逻辑的。