试着用static_cast来理解这里发生了什么?

时间:2018-04-09 14:59:02

标签: c++ static-cast

我正在开发一个旧的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的类型为PLONADDRESSpf的类型为PLONIOFILTER

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

3 个答案:

答案 0 :(得分:4)

如果您有一个派生自多个基类的类,那么这些类可以被认为是派生类的子对象。您将拥有派生对象的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

live example

我还想指出,如果你的类不是易于复制的,那么代码就有memcpy要求的未定义行为。

答案 1 :(得分:1)

static_cast进行必要的地址调整。

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

答案 2 :(得分:0)

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

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