这个C++多继承是否正确?

问题描述 投票:-1回答:1

如果有人能帮我仔细检查一下,确认听起来没问题,我将感激不尽。

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;

谢谢大家!如果有人能帮我仔细检查一下,确认听起来没问题,我会很感激。

c++ inheritance
1个回答
4
投票

如果你的问题应该解释为 "用这种层次结构来实现比例、比例-积分、比例-衍生和比例-积分-衍生控制器是否合理" 那么我的答案是

OOP的实现(在C++或其他任何语言中)并不能真正模拟现实世界。

例如,如果正方形是矩形和菱形的细化,而菱形和矩形都是平行四边形的细化,那么让正方形继承菱形和矩形就会违反Liskov替代原则。

参见 Liskov替代原理的例子是什么? 以获取更多细节。

所以,从方块回到PPIPDPID--取决于你到底想实现什么,这个模型可能有用,也可能没用。

否则,我同意其他答案和评论,这看起来像有效的C++。

copmute 是隐式地被每一个派生类覆盖,然而你可能想要标记每一个被覆盖的 computeoverride 关键字

© www.soinside.com 2019 - 2024. All rights reserved.