次のコードがあるとします。
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* にキャストするのはなぜですか?
ありがとう