0

有2个类:

class A
{
   private:
        double a1, a2;
   ...
};

class B : public A
{
   private:
        double b1, b2;
};

和一个通用容器

template <typename Item>
struct TList
{
    typedef std::vector <Item> Type;
};


template <typename Item>
class GList
{
private:
            typename TList <Item>::Type items;

} ;

有 4 个容器的对象

GList <A> A1;
GList <B> B1;
GList <A*> A2;
GList <B*> B2;

是否允许这些转换(上/下):

1] GList <B> B3 = dynamic_cast <GList <B> &> (A1);
2] GList <A> A3 = static_cast <GList <A> &> (B1);
3] GList <B*> B4 = dynamic_cast <GList <B*> &> (A2);
4] GList <A*> A4 = static_cast <GList <A*> &> (B2);

有什么方法可以将对象列表转换为父对象列表,反之亦然?

更新的问题

那么 reinterpret_cast 呢?

1] GList <B> B3 = reinterpret_cast <GList <B> &> (A1);
2] GList <A> A3 = reinterpret_cast <GList <A> &> (B1);
3] GList <B*> B4 = reinterpret_cast <GList <B*> &> (A2);
4] GList <A*> A4 = reinterpret_cast <GList <A*> &> (B2);
4

5 回答 5

1

从根本上说,容器不是协变的;std::vector<Base>和之间没有关系std::vector<Derived>(也没有std::vector<Base *>std::vector<Derived *>.

对于值类型容器,存在一个基本问题,通常是sizeof(Derived) > sizeof(Base). std::vector因此,如果您尝试将一个强制转换为另一个,那么所有内部指针数学运算都会严重中断。

在指针类型容器的情况下,这些转换可能“起作用”(如果您可以让它们编译),但行为是未定义的。

于 2011-02-19T14:25:31.263 回答
0

不,类型容器之间不存在有效转换,无论类型本身之间是否存在有效转换。

于 2011-02-19T14:31:34.203 回答
0
GList <B> B3 = dynamic_cast <GList <B> &> (A1);

dynamic_cast仅适用于多态类型。这里GList不是多态的。因此它甚至不会编译!

GList<B>如果你使这个多态,即使这样这个演员也不会起作用,因为and之间没有关系<GList<A>。它们就像两种不同的不相关的类型。

事实上,它们之间的关联方式GList_BGList_A关联方式相同(假设您使用这样的名称定义了两个不同的类)。甚至更好的是,它们的关联方式与 Java 和 JavaScript、Car 和 Carpet 的关联方式相同。

于 2011-02-19T14:31:46.963 回答
0

如果对象具有关系(如 A 和 B),则 dynamic_cast 和 static_cast 工作。

但是模板创建了一个全新的类,没有办法使用这些强制转换。也许您可以尝试 reinterpret_cast,但这并不安全...

于 2011-02-19T14:32:57.783 回答
0

您不能将对象列表转换为父对象列表。如果可以,那么我可以这样做:

GList<A>& a = convert_the_thing(B1);
a.add_a_element(A());

我会在你的 B 列表中插入一个 A。

于 2011-02-19T14:52:15.160 回答