C++ 多重继承指针&;铸造

C++ 多重继承指针&;铸造,c++,C++,给定以下代码: 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, pu

给定以下代码:

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));
}
有人介意解释一下为什么最后两个命令:

pv = &v3d;
pv = (Vertex*)(((char*)&v3d) + sizeof(Point2d));
(我猜这就是编译器将pv=&v3d转换为..)的原因

完全相同吗?我可以理解(+sizeof(Point2d))的存在,因为顶点2d首先是Point2d,所以我们必须添加大小才能到达“顶点”部分。 但为什么它首先将v3d转换为char*

谢谢

为什么它首先将v3d转换为char*

sizeof
以字节为单位生成度量值,
sizeof(char)
1
字节,因此由
(一些char\u指针)+sizeof(Point2d)
执行的指针数学将是正确的

(相关指针数学复习:)

为便于说明,假设
sizeof(Point2d)
16
。这句话

&v3d + sizeof(Point2d)

…将指向
&v3d
之后的16个字节。它将在
&v3d
之后指向16
Vertex2d
s
。或者
16*sizeof(Vertex2d)
字节。

它们不相同。一个是合法C++,另一个调用未定义的行为。为什么未定义的行为为什么?根据5.7/5,“如果指针操作数和指针算术表达式的结果都是”指向同一数组对象的元素,或指向数组对象最后一个元素后的元素,求值不应产生溢出;否则,行为未定义”。此外,根据5.2.10/7,该行为是“未指定的”。@Rouki-别担心。最后一行是胡说八道。嗯,让我看看我是否理解正确。它首先将v3d地址转换为char*,通过这样做,它现在将该内存块“视”为一个char,即一个字节。再加上(point2d)的大小,我们将直接找到顶点部分。那是正确的吗+-?@Rouki你现在似乎明白了。向指针添加数字并不总是添加那么多字节。它取决于指向的类型的大小。