1

次のコードがあるとします。

namespace Try {

class Point2d {
    float _x, _y;
public:
    Point2d(float x, float y) : _x(x), _y(y) {}
};

class Vertex {
    Vertex* next;
public:
    Vertex(Vertex* n) : next(n) {}
    Vertex() {}
};

class Vertex2d : public Point2d, public Vertex {
    float mumble;
public:
    Vertex2d(float x, float y, float mum) : Point2d(x,y), mumble(mum) {}
};
}

int main (void)
{
using Try::Point2d;
using Try::Vertex;
using Try::Vertex2d;

Vertex2d v3d(2.5,3,4);
Vertex*  pv;
Point2d* pp;

pv = &v3d;      
pv = (Vertex*)(((char*)&v3d) + sizeof(Point2d));
}

最後の 2 つのコマンドの理由を説明してくれる人はいますか。

pv = &v3d;
pv = (Vertex*)(((char*)&v3d) + sizeof(Point2d));

(コンパイラが pv = &v3d を変換したものだと思います..)

は完全に同一ですか?Vertex2d が最初に Point2d であるため、(+sizeof(Point2d)) がそこにあることがわかります。そのため、「Vertex」部分に到達するにはサイズを追加する必要があります。しかし、最初に v3d を char* にキャストするのはなぜですか?

ありがとう

4

1 に答える 1

0

v3d を最初に char* にキャストするのはなぜですか?

sizeofはバイト単位で測定値を生成し、バイトsizeof(char)ある1ため、によって実行されるポインター計算は(some_char_pointer) + sizeof(Point2d)正しくなります。

(関連するポインター数学のレビュー:)

説明のために、 であると仮定しsizeof(Point2d)ます16。この表情…

&v3d + sizeof(Point2d)

...の後の16バイトを指すことはありませんの16後にポイントします。またはバイト。&v3dVertex2d&v3d16 * sizeof(Vertex2d)

于 2013-04-14T17:46:28.570 に答える