1

私は次のクラスを持っています:

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

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

さて、オブジェクトが実際には Vector2 でなくても、Vector を Vector2 にキャストできるようにしたいと思います (つまり、dynamic_cast は私が探しているものではありません)。

何を実装すればよいですか?

  1. Vector のキャスト演算子 operator Vector2 ()
  2. Vector2 のコンストラクターVector2(const Vector<T> &)
  3. 両方

両方を実装する必要がある場合、キャスト演算子はいつ呼び出され、コンストラクターはいつ呼び出されますか?

4

2 に答える 2

2

ベクトルを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-16T11:44:17.563 に答える
0

ある型から別の型に変換できる無関係な型を使用したい場合があるため、-Vector2を受け取る明示的なコンストラクターを実装します。Vector<U>

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

暗黙の変換は、予測できない動作につながる可能性があります。子供たち、家でこれを試さないでください

于 2012-08-16T13:19:11.100 に答える