c++ - 试图通过 static_cast 了解这里发生了什么?

标签 c++ 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;

paPLONADDRESS 类型,pfPLONIOFILTER 类型。

我不明白的是如何在两个 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

live example


我还想指出,如果您的类不可简单复制,则代码具有未定义的行为,因为 memcpy 要求这样做。

关于c++ - 试图通过 static_cast 了解这里发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49735989/

相关文章:

c++ - 错误LNK2019。 Unresolved external 。请教我我搞砸了什么。

java - 在 C++ 中使用 JNI 创建 JVM 不返回

c++ - 基于值(value)的向上转型

c++ - c++中static_cast是如何实现的?

c++ - 尽管有切片,为什么 static_cast 仍然可以使用空指针?

c++ - 模板类中的条件引用声明

c++ - 用户定义的类型 - 单位、转换

c++ - 错误 : expected unqualified-id before ‘.’ token

c++ - 将指针转换为 LPVOID*

c++ - 为什么允许将派生类的方法静态转换为基类的方法?