蒙上了

问题描述:

我有以下类别:蒙上了

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

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

现在,我想是可以投放载体的Vector2 - 即使对象是不是一个真正的Vector2-(我的意思是,dynamic_cast不是我要找的)

我应该实现什么?

  1. 矢量operator Vector2()
  2. 构造转型操作上Vector2 Vector2(const Vector<T> &)

,如果我要同时实现,什么时候投运营商,并在构造函数中calld?

+1

昨天我们没有这个问题吗? '类狗:公共动物{};'。现在,如何将所有动物变成狗? – 2012-08-16 11:03:39

+0

我还没有看到:S – 2012-08-16 11:21:11

+0

这不是这种说法,但它是同一个问题。如果要将数组或向量从一种类型转换为另一种类型,则必须创建一个新副本。没有任何技巧,并且铸造'(Dog *)&Cat'只是不起作用。 – 2012-08-16 11:26:33

我将实现一个明确的构造Vector2,需要一个Vector<U> - 因为你可能想使用无关的类型,可以从一个到另一个转换。

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

隐皈依可能会导致不可预知的行为。 孩子们,千万不要在家里试这个

想要将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();