要在新类中使用另一个类,我应该继承吗?

时间:2015-11-06 15:58:37

标签: c++ class inheritance

背景:我有一个class Button,其中包含状态数据,纹理和一些成员函数,如draw()。现在我想创建包含Button对象(class Buttons)向量的新vector<Button> ButtonList,以及用于维护它们并可能根据点击触发操作的成员函数。 Button位于单独的标头和cpp文件中。 ~Buttons负责删除单个Button个对象。

问题:我是否在继承Button类方面获得了优势,而不仅仅是#include Button?或者我应该注意哪些陷阱。

我打算在以后扩展Button课程。 我可能会过度思考这一点,而且我对课程还很陌生。

包括的例子:

#include <vector>
#include "Button.h"

class Buttons
{
public:
    Buttons();
    ~Buttons();

    void addButton(int ID);
    void removeButton(int ID);
    void updateButtons();

private:
    std::vector<Button> buttonList;
};

继承的例子:

#include <vector>
#include "Button.h"

class Buttons:Button
{
public:
    Buttons();
    ~Buttons();

    void addButton(int ID);
    void removeButton(int ID);
    void updateButtons();

private:
    std::vector<Button> buttonList;
};

2 个答案:

答案 0 :(得分:3)

你应该使Buttons继承Button,因为使用类型为Buttons的对象没有意义Button 1}}是预期的。

继承是两个(或更多)类中最强的关系,它不应该用于简单的代码重构,更不能用于定义“集合”关系。

答案 1 :(得分:2)

  

问题:继承Button类是否有任何优势,   而不只是#include Button

这个特殊问题没有意义,因为问题是正交的。带有std::vector的继承和合成都需要Button的完整定义,因此需要#include "button.h"

  

我可能会过度思考这一点,而且我对课程还很陌生。

如果有疑问,赞成合成优于继承

#include <vector>
#include "Button.h"

class Buttons
{
public:
    Buttons();
    ~Buttons();

    void addButton(int ID);
    void removeButton(int ID);
    void updateButtons();

private:
    std::vector<Button> buttonList;
};

这是一个非常好的解决方案。你不可能得到比这更清晰的C ++。

class Buttons:Button

相比之下,这条线没有多大意义。它使用私有继承来模拟合成,因为类型是class。我很确定这绝对不是你的意图。如果您的班级已经包含Button

,为什么还要额外添加std::vector<Button>

该行显示为&#34;按钮对象包含一个按钮&#34;

当然,公共继承会更有意义:

class Buttons : public Button

这将显示为&#34;按钮对象 一个按钮&#34;

private:
    std::vector<Button> buttonList;

因此,结合这一行,上面的两个继承版本意味着&#34;一个按钮对象包含一个按钮,还有一些按钮&#34; &#34;按钮对象 一个按钮,还包含一些按钮&#34;

底线:使用无继承版本。

然而,你的问题还有一句话听起来有点令人担忧:

  

~Buttons负责删除单个Button个对象。

是的,但只是非常间接,因为std::vector析构函数会自动执行此操作。事实上,在您展示的代码中,您根本不需要声明析构函数。如果你在析构函数中做了额外的工作,那么可能会出现问题。