蒙上了
问题描述:
我有以下类别:蒙上了
template<typename T>
class Vector { ... };
template<typename T>
class Vector2 : public Vector<T> { ... };
现在,我想是可以投放载体的Vector2 - 即使对象是不是一个真正的Vector2-(我的意思是,dynamic_cast不是我要找的)
我应该实现什么?
- 矢量
operator Vector2()
- 构造转型操作上Vector2
Vector2(const Vector<T> &)
- 都
,如果我要同时实现,什么时候投运营商,并在构造函数中calld?
答
我将实现一个明确的构造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();
昨天我们没有这个问题吗? '类狗:公共动物{};'。现在,如何将所有动物变成狗? – 2012-08-16 11:03:39
我还没有看到:S – 2012-08-16 11:21:11
这不是这种说法,但它是同一个问题。如果要将数组或向量从一种类型转换为另一种类型,则必须创建一个新副本。没有任何技巧,并且铸造'(Dog *)&Cat'只是不起作用。 – 2012-08-16 11:26:33