我正在尝试将一些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()
方法。它似乎没有身体,也没有任何回报。这是如何运作的?这种方式完全是多余的吗?
2:派生类中的factorMarginal()
方法。是否超过了基本因素的边缘方法。此外,此方法的最后一行称为自己(没有任何括号),我很困惑这是什么。它被称为基类factorMarginal还是实现某种递归?
答案 0 :(得分:3)
基类中的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 ++等价物。