1

我有以下课程:

template<typename T>
class Vector { ... };

template<typename T>
class Vector2 : public Vector<T> { ... };

现在,我希望能够将 Vector 转换为 Vector2 - 即使对象不是真正的 Vector2- (我的意思是,dynamic_cast 不是我想要的)

我应该实施什么?

  1. Vector 上的强制转换运算符 operator Vector2 ()
  2. Vector2 上的构造函数Vector2(const Vector<T> &)
  3. 两个都

如果我应该同时实现这两个,什么时候会转换操作符,什么时候调用构造函数?

4

2 回答 2

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();
于 2012-08-16T11:44:17.563 回答
0

我将实现一个显式构造函数Vector2,它采用Vector<U>-- 因为您可能想要使用可以从一个转换为另一个的不相关类型。

template <typename T>
class Vector2 : public Vector< T >
{
public:
    template <typename U>
    explicit Vector2(const Vector< U >& copyFrom)
    {
        // ...
    }
};

隐式转换可能会导致不可预知的行为。孩子们,不要在家里尝试这个

于 2012-08-16T13:19:11.100 回答