我正在开发一个旧的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
的工作方式,这是否允许?
答案 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
我还想指出,如果你的类不是易于复制的,那么代码就有memcpy
要求的未定义行为。
答案 1 :(得分:1)
static_cast
进行必要的地址调整。
代码(带有memcpy
,大写名称,指针的typedef)是如何绝对不做事的一个很好的例子。也许它被用作关于如何快速失去工作的系列讲座中的一个例子。
答案 2 :(得分:0)
这是一些非常可疑的C ++代码的示例。我很难想象为什么这段代码是必要的 - 很可能,它不是。
然而,为了回答所提出的问题,多重继承在C ++中的工作方式是通过使用不同的子对象&#39;派生类中的不同基类。这些子对象没有相同的地址。在static_cast
上使用this
,您可以选择一个子对象或另一个子对象,static_cast
的结果会产生不同的地址。