我正在处理一个旧的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
的结果会产生不同的地址。