想了解 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;
pa
是 PLONADDRESS
类型,pf
是 PLONIOFILTER
.
类型
我不明白的是如何在两个 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
我还想指出,如果您的 class 不可简单复制,则代码具有未定义的行为,因为 memcpy
要求。
我正在处理一个旧的 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;
pa
是 PLONADDRESS
类型,pf
是 PLONIOFILTER
.
我不明白的是如何在两个 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
我还想指出,如果您的 class 不可简单复制,则代码具有未定义的行为,因为 memcpy
要求。