我正在处理一个旧的 C++ 项目,在源代码中有两行:
memcpy( static_cast<PLONADDRESS>(this), pa, sizeof(LONADDRESS) );
memcpy( static_cast<PLONIOFILTER)(this), pf, sizeof(LONIOFILTER) );
this
是一个 CLonFilterUnit 类型的对象,它派生自公共(public)类:
class CLonFilterUnit : public LONADDRESS, public LONIOFILTER
PLONADDRESS
是:
typedef LONADDRESS* PLONADRESS;
PLONFILTER
是:
typedef LONIOFILTER* PLONFILTER;
pa
是 PLONADDRESS
类型,pf
是 PLONIOFILTER
类型。
我不明白的是如何在两个 memcpy
指令中将相同的基地址用作目标?由于 static_cast
的工作方式,是否允许这样做?
最佳答案
当您有一个派生自多个基类的类时,可以将这些类视为派生类的子对象。您将拥有派生对象的 base1、base2、...、baseN 部分。当您 static_cast
将派生类的指针指向其基类之一的指针时,强制转换将调整指针以指向该对象的正确基类(子对象)。你可以通过这个小例子看到这一点:
struct foo
{
int a;
};
struct bar
{
int b;
};
struct foobar : foo, bar {};
int main() {
foobar f;
std::cout << static_cast<foo*>(&f) << "\t" << static_cast<bar*>(&f);
}
输出:
0x7ffe250056c8 0x7ffe250056cc
我还想指出,如果您的类不可简单复制,则代码具有未定义的行为,因为 memcpy
要求这样做。
关于c++ - 试图通过 static_cast 了解这里发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49735989/