C++ 动态强制转换、对象列表转换、模板

C++ 动态强制转换、对象列表转换、模板,c++,templates,dynamic-cast,C++,Templates,Dynamic Cast,分为两类: 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 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;
模板
结构列表
{
typedef std::向量类型;
};
模板
课堂英语
{
私人:
typename-TList::类型项;
})

有4个容器的对象

GList <A> A1;
GList <B> B1;
GList <A*> A2;
GList <B*> B2;
glista1;
闪光B1;
glista2;
闪光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);
1]GList B3=动态铸造(A1);
2] GList A3=静态铸件(B1);
3] GList B4=动态铸造(A2);
4] GList A4=静态铸件(B2);
有没有办法将对象列表转换为父对象列表,反之亦然

更新的问题

那么重新解释演员阵容呢

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);
1]GList B3=重新解释铸件(A1);
2] GList A3=重新解释铸件(B1);
3] GList B4=重新解释铸件(A2);
4] GList A4=重新解释铸件(B2);

从根本上说,容器不是协变的;
std::vector
std::vector
之间没有关系(也没有
std::vector
std::vector
之间的关系)

在值类型容器的情况下,有一个基本问题,通常是,
sizeof(派生)>sizeof(基)
。因此,如果您试图将一个强制到另一个,则
std::vector
中的所有内部指针数学都将严重中断


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

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

GList B3=dynamic_cast(A1);
GList <B> B3 = dynamic_cast <GList <B> &> (A1);
dynamic\u cast
仅适用于多态类型。此处的
GList
不是多态类型。因此它甚至不会编译


如果将此多态化,即使这样,此强制转换也不会工作,因为如果对象之间存在关系(如a和B),则
GList
动态强制转换和静态强制转换之间没有关系


但是模板创建了一个全新的类,无法使用这些强制转换。也许您可以尝试重新解释强制转换,但这不安全…

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

GList<A>& a = convert_the_thing(B1);
a.add_a_element(A());
GList&a=转换事物(B1);
a、 添加_a_元素(a());

我会在你的B列表中插入a。

@Robo:那你怎么解释它呢?