c++ - 如何自动查找大型 C++ 代码中的所有钻石?

标签 c++ inheritance code-analysis static-code-analysis diamond-problem

( Related softwarerecs question with answer. )

考虑有一个非常大的类层次结构,由数十甚至数百个类组成。继承图也非常复杂(如果没有半页大小的箭头,doxygen 就无法渲染它:-))。而且,可怕的菱形继承(钻石问题)来了。

考虑一点类似于 Java 的编程:任何基类都不可能需要在任何继承结构中多次存在。

还有一个目标,就是尽量减少虚拟继承的数量。

我认为,在这种情况下,情况很简单:无论我们有多少个或多么复杂的钻石,总是第二层钻石需要从顶部继承,并且没有其他

问题:这真的足够了吗,还是还有其他原因,因为可能需要虚拟继承的基类?

大约是这样:

Red penciled inheritance arrows need to be virtual

这里红色铅笔继承箭头需要是虚拟的。在如此简单的结构中很容易找到所有这些,但在更大的结构中则不然。

找到所有钻石似乎是一个容易自动化的图形行走问题。如果该任务的解决方案不存在,我会感到惊讶。

问题是这是否足够?

最佳答案

看看 Bjarne Stroustrup 的论文,了解如何通过为每个类分配素数和合数来实现快速动态转换:http://www.stroustrup.com/fast_dynamic_casting.pdf

如果你实现它,也许通过某些代码处理工具自动实现,并且发现第二个数字可以被平方数整除(或者,一般来说,可以被 p^n 整除,其中 p 是素数),那么你就得到了菱形和除数的素除数表明哪个类是问题的根源。然后您只需要跟踪您的类(class)(同样,通过 % 操作)。

关于c++ - 如何自动查找大型 C++ 代码中的所有钻石?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38274379/

相关文章:

java - 通过扩展 BaseActivites 来划分职责是不好的做法吗?

c# - Microsoft分析器为什么找不到Microsoft.CodeAnalysis?

php - C++ WinSock 从 PHP 页面获取数据?

c++ - 如何实现几个函数的编译时多态?

Django:将继承(嵌套)值呈现为 forms.ModelForm 中的列表

java - 插入排序、合并排序和快速排序的测试用例

c# - 如何抑制所有类型成员的代码分析消息?

c# - 没有垃圾收集的 .NET 的强大功能?

c++ - 多态性c++错误输出

c++ - 子类调用父成员而不是它自己的成员