想了解 static_cast 这里发生了什么?

Trying to understand what is happening here with static_cast?

我正在处理一个旧的 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;

paPLONADDRESS 类型,pfPLONIOFILTER.

类型

我不明白的是如何在两个 memcpy 指令中使用相同的基地址作为目标?由于 static_cast 的工作方式,是否允许这样做?

这是一些极其可疑的 C++ 代码的示例。我很难想象为什么需要这段代码 - 很可能不需要。

但是,要回答所问的问题,多重继承在 C++ 中的工作方式是在派生的 class 中具有不同 class 的不同基础 'subobjects'。这些子对象没有相同的地址。通过在 this 上使用 static_cast,您 select 一个或另一个子对象,static_cast 的结果产生不同的地址。

static_cast 进行必要的地址调整。

代码(带有 memcpy、大写名称、指针的类型定义)是如何绝对不做某事的一个很好的例子。也许它被用作关于如何快速失业的系列讲座中的一个例子。

当你有一个从多个基础 classes 派生的 class 时,那些 classes 可以被认为是派生的 class 的子对象。您将拥有派生对象的 base1、base2、...、baseN 部分。当您 static_cast 指向派生 class 的指针指向其基类之一的指针时 classes 转换将调整指针以指向对象的正确基类(子对象) .你可以通过这个小例子看到这一点:

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

live example


我还想指出,如果您的 class 不可简单复制,则代码具有未定义的行为,因为 memcpy 要求。