( Related softwarerecs question with answer. )
考虑有一个非常大的类层次结构,由数十甚至数百个类组成。继承图也非常复杂(如果没有半页大小的箭头,doxygen 就无法渲染它:-))。而且,可怕的菱形继承(钻石问题)来了。
考虑一点类似于 Java 的编程:任何基类都不可能需要在任何继承结构中多次存在。
还有一个目标,就是尽量减少虚拟继承的数量。
我认为,在这种情况下,情况很简单:无论我们有多少个或多么复杂的钻石,总是第二层钻石需要从顶部继承,并且没有其他。
问题:这真的足够了吗,还是还有其他原因,因为可能需要虚拟继承的基类?
大约是这样:
这里红色铅笔继承箭头需要是虚拟的。在如此简单的结构中很容易找到所有这些,但在更大的结构中则不然。
找到所有钻石似乎是一个容易自动化的图形行走问题。如果该任务的解决方案不存在,我会感到惊讶。
问题是这是否足够?
最佳答案
看看 Bjarne Stroustrup 的论文,了解如何通过为每个类分配素数和合数来实现快速动态转换:http://www.stroustrup.com/fast_dynamic_casting.pdf
如果你实现它,也许通过某些代码处理工具自动实现,并且发现第二个数字可以被平方数整除(或者,一般来说,可以被 p^n 整除,其中 p 是素数),那么你就得到了菱形和除数的素除数表明哪个类是问题的根源。然后您只需要跟踪您的类(class)(同样,通过 %
操作)。
关于c++ - 如何自动查找大型 C++ 代码中的所有钻石?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38274379/