从B转为基础A级

时间:2012-08-16 11:00:15

标签: c++ casting operator-keyword base derived

我有以下课程:

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

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

现在,我希望能够将Vector转换为Vector2 - 即使对象实际上不是Vector2-(我的意思是,dynamic_cast不是我正在寻找的)

我应该实施什么?

  1. 向量operator Vector2 ()
  2. 上的强制转换运算符
  3. Vector2 Vector2(const Vector<T> &)
  4. 上的构造函数
  5. 两个
  6. 如果我应该同时实现这两个,那么转换运算符何时以及何时构造函数是calld?

2 个答案:

答案 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)
    {
        // ...
    }
};

隐性转换可能会导致不可预测的行为。 孩子们,不要在家里试试