私人继承和组合,哪一个最好,为什么?

Zia*_*man 4 c++ oop

假设我有一个类engin,我从engin类继承了一个类汽车

class engin
{
    public:
        engin(int nobofcylinders);
        void start();
};
class car:private engin
{
    public:
        car():e(8){}
        void start()
        {
            e.start();
        }
    private:
        engin e;
};
Run Code Online (Sandbox Code Playgroud)

现在同样可以通过组合来完成,问题是哪个approch最好,主要用于编程,以及为什么???????

小智 6

组成是首选的两个主要原因:

  • 正在编写的东西可以有名字
  • 你可以组成同一类型的多个东西


ken*_*ytm 5

如果要将私有继承与组合进行比较,请阅读http://www.parashift.com/c++-faq-lite/private-inheritance.html#faq-24.3.我不认为私人继承是好的.


一个Car 有一个 Engine,但是一个Car 不是一个 Engine,所以最好用作文来完成.

继承对"is-a"关系很有用,例如a Bus -a Car,a Car is-a vehicle等.

组合对于"has-a"关系很有用,例如Car has Wheel -s,Car has-an Engine等.

所以逻辑代码应该是这样的

class Car : public Vehicle {
    Engine engine;
    Wheel  wheels[4];
    ...
};
Run Code Online (Sandbox Code Playgroud)

  • 私有继承*不*建立一个has-a关系."继承"这个名称在这里只是误导.相反,它模拟了一个is-implemented-in-terms-of-relationship(在这里也不合适). (2认同)
  • 那么,私有继承不会创建一个is-a关系.我同意作文更好. (2认同)

Dmi*_*try 5

我更喜欢将继承视为derived is a kind of base,这基本上意味着公共继承。在私有继承的情况下,它更像是derived has a base,恕我直言听起来不正确,因为恕我直言,这是组合的工作,而不是任何类型的继承。那么,既然私有继承和组合在逻辑上本质上是相同的,那么选择哪个呢?有了你发布的例子,我肯定会去作曲。为什么?我倾向于将各种继承视为一种kind of关系,就您发布的示例而言,我想不出我可以说的情况a car is kind of an engine,它根本不是。确实很像a car has an engine,那么为什么汽车会继承发动机呢?我看不出任何原因。

现在,确实在某些情况下,私有继承是好的,即boost::noncopyable,由于它的 ctor/dtor 受到保护,您将很难实例化它,而且实际上,由于我们希望我们的类能够have a noncopyable part,这是唯一的出路。

一些风格指南(例如google c++ 风格指南)甚至建议永远不要使用私有继承,原因与我已经写过的类似 - 私有继承有点令人困惑。