如果有人能帮我仔细检查一下,确认听起来没问题,我将感激不尽。
class P {
protected:
float p();
public:
virtual float compute() { return p(); };
};
class PI : virtual public P {
protected:
float i();
public:
float compute() { return p() + i(); };
};
class PD : virtual public P {
protected:
float d();
public:
float compute() { return p() + d(); };
};
class PID : public PI, public PD {
public:
float compute() { return p() + i() + d(); };
};
更新(1):让样本更加连贯,以备后人之需。
更新(2):好了,在我们关闭之前,最后再推一把;P::compute()是否需要是虚拟的?
更新(3):计划有变,如何实现?
Controller<PD> p;
或
Controller<PID> pid;
谢谢大家!如果有人能帮我仔细检查一下,确认听起来没问题,我会很感激。
如果你的问题应该解释为 "用这种层次结构来实现比例、比例-积分、比例-衍生和比例-积分-衍生控制器是否合理" 那么我的答案是
OOP的实现(在C++或其他任何语言中)并不能真正模拟现实世界。
例如,如果正方形是矩形和菱形的细化,而菱形和矩形都是平行四边形的细化,那么让正方形继承菱形和矩形就会违反Liskov替代原则。
参见 Liskov替代原理的例子是什么? 以获取更多细节。
所以,从方块回到PPIPDPID--取决于你到底想实现什么,这个模型可能有用,也可能没用。
否则,我同意其他答案和评论,这看起来像有效的C++。
copmute
是隐式地被每一个派生类覆盖,然而你可能想要标记每一个被覆盖的 compute
与 override
关键字