我有以下课程:
template<typename T>
class Vector { ... };
template<typename T>
class Vector2 : public Vector<T> { ... };
现在,我希望能够将Vector转换为Vector2 - 即使对象实际上不是Vector2-(我的意思是,dynamic_cast不是我正在寻找的)
我应该实施什么?
operator Vector2 ()
Vector2(const Vector<T> &)
如果我应该同时实现这两个,那么转换运算符何时以及何时构造函数是calld?
答案 0 :(得分:2)
你想将Vector转换为Vector2 - 即使该对象实际上不是Vector2 ?如果不制作新副本,你真的不能这样做。你可以这样做:
class Vector2 { public: void test() {} };
Vector foo;
Vector2* bad = reinterpret_cast<Vector2*>(&foo);
bad->test();
但是你只需要根据Vector2
类定义的偏移调用方法。如果它让你高兴,你可以将任何类转换为Vector2
指针,但不要指望任何工作。
int stackInteger = 42;
Vector2* reallyBad = reinterpret_cast<Vector2*>(&stackInteger);
reallyBad->test();
答案 1 :(得分:0)
我会实现一个带有Vector2
的显式构造函数Vector<U>
- 因为您可能希望使用可以从一个转换为另一个的不相关类型。
template <typename T>
class Vector2 : public Vector< T >
{
public:
template <typename U>
explicit Vector2(const Vector< U >& copyFrom)
{
// ...
}
};
隐性转换可能会导致不可预测的行为。 孩子们,不要在家里试试。