试图了解这里发生的事情static_cast

Trying to understand what is happening here with static_cast?

本文关键字:static cast 了解 这里      更新时间:2023-10-16

我正在处理一个旧的C++项目,源代码中有两行:

memcpy( static_cast<PLONADDRESS>(this), pa, sizeof(LONADDRESS) );
memcpy( static_cast<PLONIOFILTER)(this), pf, sizeof(LONIOFILTER) );

this是 CLonFilterUnit 类型的对象,它派生自公共类:

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需要这样做。

>static_cast进行必要的地址调整。

代码(带有memcpy,大写名称,指针的typedefs(是一个很好的例子,说明如何绝对不做事。也许它被用作关于如何快速失去工作的系列讲座的一个例子。

这是

一些非常可疑的C++代码的示例。我很难想象为什么这段代码是必要的——很可能不是。

但是,为了回答所提出的问题,多重继承在C++中的工作方式是在派生类中具有不同基类的不同"子对象"。这些子对象没有相同的地址。通过在this上使用static_cast,您可以选择一个子对象或另一个子对象,static_cast的结果会产生不同的地址。