如何禁止隐式转换为基类
How do I forbid implicit conversion to base class?
我想在我的代码中清楚地区分3D和2D点。最明显的解决方案是使用单独的类。
另一方面,从z = 0的3D点到2D点的转换是很常见的。因此,我想使用一个公共基类,这样我就可以在内存中进行这些转换。为了清楚地区分类型,我想禁止对基类的隐式转换。这可行吗?
或者是否有一种不同的方法可以用类似的函数创建不同的类型?
如果你想在没有任何复制的情况下访问3d向量的2d部分,真的只有一个合理的解决方案。
class Vector2d { ... };
class Vector3d {
Vector2d part2d;
double z;
public:
Vector2d& as2d() { return part2d; }
};
任何基于继承的诡计都很可能导致糟糕的设计、未定义的行为,或者两者兼而有之。
您可以私下派生子类:
class PointBase {
// ...
};
class Point2D : private PointBase {
// ...
};
class Point3D : private PointBase {
// ...
};
这种方法的副作用是,PointBase
的任何公共成员都将从外部不可访问,因此子类必须显式地使它们可访问,要么通过为它们提供代理方法,要么用关键字using
指定它们。这就是为什么只有当PointBase
中的公共逻辑相当大并且在单个地方实现它带来的好处大于所提到的缺点时,我才会这样做。
这并不能回答你的问题,但是为了解决你的问题,你可以在3D类中创建一个方法,当请求时返回一个2D点
如果你的点被存储为一个矢量,你可以定义你的3D和2D点类作为模板类与int
参数将指定维度计数:
template<int dimensions> class Point {
vector<int> coords;
Point() : coords(dimensions) {}
....
template<int other_dimensions> convertToPoint() const
{
// Handle different options here like:
// dimensions > other_dimensions
// dimensions < other_dimensions
// et cetera
}
};
和实例化点类:
typedef Point<2> Point2D;
typedef Point<3> Point3D;
Point2D pt = Point3D(1, 2, 3).convertToPoint<2>(); // Point2D(1, 2);
Point3D pt = Point2D(4, 5).convertToPoint<2>(); // Point3D(4, 5, 0);
这样,您将拥有相同的逻辑,但类型和转换完全不同。更不用说你只需要定义一个类,而不是两个单独的
相关文章:
- 从基类实例调用派生类方法而不进行强制转换
- C++将派生类转换为基类时'object slicing'期间发生的情况
- 派生类(构造函数具有参数)和基类(构造函数缺少参数)之间没有可行的转换
- 调用不在基类中的派生类函数而不进行动态强制转换,以最大程度地提高性能
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- 我们可以在不知道其真实类型的情况下将基类指针转换为派生类指针吗?
- 从未使用过到基类的转换
- 基类到派生类的强制转换向量
- 有没有办法复制派生类指针的向量而不将其强制转换为基类?
- 为什么此代码不将基类强制转换为 c++ 中的派生类?
- 如何在运行时将指向派生类的 void* 正确转换为指向基类的 void*
- 从基类的共享指针向下转换到派生类的引用
- 为了访问方法,从基类动态转换为派生类
- 派生类 插入和提取运算符重载以及基类与派生类之间的强制转换
- 将空基类优化对象强制转换为另一种类型是否会破坏严格的别名?
- 基类到派生模板类的强制转换指针,而不知道类型
- 带有基类指针的强制转换向量,指向子类
- 通过转换基类指针来设置派生类字段
- 强制转换基类问题
- 强制转换基类保护方法的返回指针的替代方法