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

オブジェクトのリストを親オブジェクトのリストに変換することはできません。できれば、私はこれを行うことができます:

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

そして、私はあなたのBのリストにAを挿入したでしょう.

于 2011-02-19T14:52:15.160 に答える
0

いいえ、型自体の間に有効な変換があるかどうかに関係なく、型のコンテナー間に有効な変換はありません。

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

dynamic_castポリモーフィック型のみで動作します。ここGListではポリモーフィックではありません。したがって、コンパイルすらできません!

GList<B>このポリモーフィックを作成しても、 と の間に関係がないため、このキャストは機能しません<GList<A>。それらは、2 つの異なる無関係なタイプのようなものです。

実際、それらは と同じように関連付けられており、関連付けられていますGList_B(GList_Aそのような名前で 2 つの異なるクラスを定義したとします)。さらに良いことに、それらは 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 に答える