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