c ++覆盖继承是否可能和良好做法?

时间:2016-12-13 11:21:13

标签: c++ design-patterns

c ++中的以下结构是否可行并推荐?

class IColour{}

class Grey: public IColour {}

class DarkGrey: public IColour {}

class IMaterial {}

class Rock: public Material, public Grey {}

class Basalt : public Rock, public DarkGrey {}

有没有办法覆盖派生类中基类的继承?也就是说,是否可以用玄武岩中的DarkGrey覆盖Gray的继承?

2 个答案:

答案 0 :(得分:6)

继承描述了“是一种”关系。

玄武岩不是一种“深灰色”。可以说将颜色描述为属性更好,因为每个岩石都有颜色,它不是颜色。

这样的事情:

class IColour{};

class Grey: public IColour {};

class DarkGrey: public IColour {};

const IColour& dark_grey()
{
  static DarkGrey _ {};
  return _;
}

const IColour& grey()
{
  static Grey _ {};
  return _;
}

class IMaterial {
  virtual const IColour& get_colour() const = 0;
};

class Rock: public IMaterial
{
    const IColour& get_colour() const override {
        return grey();
    }
};

class Basalt : public Rock
{
    const IColour& get_colour() const override {
        return dark_grey();
    }
};

答案 1 :(得分:1)

您无法重新定义类型,只能创建新类型。 所以在本质上你写的时候

class Basalt : public Rock, public DarkGrey {}

more或多或少暗示

class Basalt : public Material, public Grey {}, public DarkGrey {}

此处DarkGrey并不替换Grey,它会在其旁边添加