这个 C++ 强制转换代码在做啥?

Posted

技术标签:

【中文标题】这个 C++ 强制转换代码在做啥?【英文标题】:What is this C++ casting code doing?这个 C++ 强制转换代码在做什么? 【发布时间】:2014-10-14 12:55:37 【问题描述】:

在这里找到:https://github.com/tpaviot/oce/blob/master/src/BRepAdaptor/BRepAdaptor_Curve.cxx

我想知道的是:

((GeomAdaptor_Curve*) (void*) &myCurve)->Load(C,First,Last);

myCurve 已定义为GeomAdaptor_Curve。所以看起来它将指向myCurve 的指针转换为void*,然后将that 转换为GeomAdaptor_Curve*,然后取消引用并调用Load。这样做有什么可能的原因,而不是简单地调用myCurve.Load

【问题讨论】:

遗留代码很可能,之前的时间可能是另一种类型,需要转换为GeomAdaptor_Curve,但双重转换真的很奇怪,如果涉及指针算术,就不会那么奇怪了。在-> 之前,这真的很奇怪。 现在似乎没有任何理由。同一类中的其他方法只需直接调用myCurve.Load() 【参考方案1】:

请注意,该语句出现在 const 成员函数中。所以&myCurve 的类型实际上是GeomAdaptor_Curve const*。这似乎是一种丑陋而令人困惑的说法

const_cast<GeomAdaptor_Curve&>(myCurve).Load(C,First,Last);

为了“避免”编译器警告,您可能会因为尝试使用 C 样式强制转换来规避 const 而变得更加复杂。

【讨论】:

【参考方案2】:

我能想到的唯一原因是确保“GeomAdaptor_Curve 的子类”类型的变量被强制调用超类的Load 函数。

转换为void*,然后转换为GeomAdaptor_Curve*,将保证该类型被视为后者,无论其实际类型如何。

查看了代码后,我看不出有什么可能性,所以很可能是遗留代码或他们为未来扩展而放入的东西。

可能值得联系 GitHub 上的 dbarbier 用户,因为他们似乎对更改负有全部责任(基于历史记录)。

虽然,由于那段代码似乎在最早的 GitHub 版本中,如果您能找到它们,原作者可能是更好的选择(请参阅文件头中的一个 Remi LEQUETTE)。

【讨论】:

我检查了 repo,正如 OP 所说。 myCurve 已经只是 GeomAdaptor_Curve 的类型。不是子类也不是超类。我更愿意认为这个演员只是一个不必要的遗留代码。

以上是关于这个 C++ 强制转换代码在做啥?的主要内容,如果未能解决你的问题,请参考以下文章

C++中“强制转换”的四大天王

C++ 之 强制转换

C++ 子类化、继承和强制转换

模板类的 C++ 强制转换

在 c++ 逻辑层上强制转换 int

C++中的数据类型强制转换