我正在尝试将一些Scala代码转换为C++,这是我第一次接触Scala,并且在某些代码方面遇到了麻烦。因此,我有一个基类如下:

sealed abstract class FactorNode(factor: Factor) extends Node {
    private var _factor: Factor = factor
    def factorMarginal(): Factor
}

现在,我有一个派生类,如下所示:
case class SingleFactorNode(factor: SingleFactor, gate: FactorGate) extends FactorNode(factor) {
    def factorMarginal(): Factor = {
    val inMsg = gate.getEndGate().getMessage()
    val factorMarginal = factor * inMsg
    factorMarginal
    }
}

几个问题:1:基类中的factorMarginal()方法。它似乎没有 body ,什么也没返回。这是如何运作的?它的样子完全多余吗?

2:第二个派生类中的factorMarginal()方法。是过度骑乘的基本因素Marginal方法。另外,此方法的最后一行称为自身(没有任何括号),我对此感到困惑。它称为基类factorMarginal还是实现某种递归?

最佳答案

基类中的factorMarginal方法是抽象的。在C++中,您将使其成为纯虚拟的:

virtual Factor factorMarginal() = 0;

是的,派生类中的factorMarginal方法将覆盖基类中的方法。在C++中,您可以这样编写:
virtual Factor factorMarginal() override {
    auto const inMsg = gate.getEndGate().getMessage();
    return factor * inMsg;
}

最后一行并没有调用方法本身,而是返回具有相同名称的局部变量。

如果可以的话,请确保在C++中使用const方法。

请注意,Scala的sealed没有C++等效项。

10-04 18:24