gpt4 book ai didi

c++ - C++多重继承转换如何工作?

转载 作者:太空狗 更新时间:2023-10-29 21:21:49 27 4
gpt4 key购买 nike

This question帮助我理解了一点,但我的问题与他们的略有不同。

我在 C++ 中理解的基本类型转换涉及将内存中的结构重新解释为不同的结构。例如:

class Building{int sqFootage;};

class Office : public Building{int cubicles;};

int main(int argc, char** argv){
Office *foo = new Office();
/*The cubicles member appears after the sqFootage member on an Office,
* so the foo pointer is really just a Building* with some extra
* information after it.
*/
Building *bar = (Building*)foo;
return 0;
};

这里的关键点是办公室可以在内存中解释为建筑物,而无需对结构进行任何更改。这在多重继承情况下分解:

class Animal{bool alive;};

class WaterDweller : public Animal{float swimSpeed;};

class LandDweller : public Animal{float runSpeed;};

class Amphibian : public WaterDweller, public LandDweller{float transitionSpeed};

int main(int argc, char** argv){
Amphibian *amph = new Amphibian();
LandDweller *land = (LandDweller*)amph;
WaterDweller *sea = (WaterDweller*)amph;
}

如果不重新组织 Amphibian 结构,就不可能将 amph 同时解释为 LandDwellerWaterDweller在内存中。 假设它们具有任何有用的含义,这些转换是如何工作的?如果没有,static_castdynamic_castreinterpret_cast 在这里合适吗?

编辑:非常感谢您对 Sneftel 的回答。 TinyDr link您在其中一条评论中提供的内容非常有帮助,我会牢记一些避免 C 风格转换的建议。

对于那些好奇的人,这里是我尝试运行这段代码时得到的指示:

land 0x22c8018
sea 0x22c8010
run 0x22c801c
swim 0x22c8014
land alive 0x22c8018
sea alive 0x22c8010

您可以在这里看到,即使 Land 和 Water Dwellers 继承自相同的基类,它们也包含自己的拷贝,就好像基类不同一样。这导致了 Sneftel 在评论中提到的 Diamond Problem。

最佳答案

如果您查看存储在 land 中的地址,您会发现它的数字大于 amph。那是因为,在 C++ 中,转换最终可以将指针算术作为其内部操作的一部分。 Amphibian 中有一个WaterDweller,然后是一个LandDweller。当转换到数据不在派生类开头的基类型时,指针会调整到该基类数据的开始位置。

顺便说一句,听取 Dieter 的建议,不要在 C++ 中使用 C 风格的转换(尤其是指针类型)。 C++ 中 C 风格转换的行为是 static_castreinterpret_castconst_cast 的混合体,很容易最终做出不同的事情超出您的预期,甚至没有编译器警告。最好使您正在执行的转换类型明确。

关于c++ - C++多重继承转换如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21838382/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com