试图了解这里发生的事情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 类型的对象,它派生自公共类:
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
的结果会产生不同的地址。
相关文章:
- 如何理解C++标准N3337中的expr.const.cast子句8
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- C++Cast运算符过载
- 如何处理 c++ 中类实现中的"invalid use of non-static data member"?
- 收到错误"invalid use of non-static data member 'stu::n' "
- LNK1104:无法打开libpjproject-i386-Win32-vc14-Debug-Static.lib
- 我应该在 C++ 中何时/为什么使用 STATIC?
- 在VS2019项目中集成ImageMagick:x64-windows-static library
- 如何处理Boost Spirit X3导致Visual Studio 2019 "static initialization order fiasco"?
- "static char __ = []() -> char"的含义
- 当初始值设定项是基类名时'initializer does not name a non-static data member or base class'错误
- 无法在 DLL 中链接 SDL2-static.lib
- 如何摆脱C++中未解析的外部符号"private: static char"错误?
- 错误:"cast"未命名类型void setCastDescription(std::string
- 通过使用 const-cast 的非常量引用来延长临时的寿命
- C++线程"Call to non-static member function without an object argument"
- 出现这种错误的原因是什么"invalid use of non-static data member "
- "(void) cast"与功能有什么区别 "__attributes__"来沉默未使用的参数警告?
- static是如何使用ClassA::m_variable处理所有类对象的
- 在[expr.static.cast]/4中,术语"一个可行函数"指的是什么