首页 > 代码库 > 谈谈C++私有继承

谈谈C++私有继承

许多C++程序员从来没用过私有继承来设计他的类。的确,如果是本该用私有继承的地方却用了公有继承,对程序的功能的实现并无影响。但这种误用是一种错位的描述,会引起阅读者的误解,甚至会引起类的使用者的茫然。当我们在写一个类的声明的时候,实际上是在做一个意图的设计。而设计者需要的恰恰是精确描述。

  • 私有继承的弦外之音

要解释私有继承,我们先来看看共有继承,好做个比较。

公有继承,本质上就是 is-a 的关系。如,描述吉普车是一种车,那么可以进行以下的设计:

class Car
{
};

class Jeep : public Car
{
}

私有继承,子类只能在类内部使用父类的功能,而不能将父类的功能以接口的形式开放给外部,也就是说,子类的对象无法直接使用到父类的功能接口。所以,私有继承的涵义就成了:子类可以借助父类的功能来实现自己的功能。这就是典型的has-a 的关系。

class Engine
{
public:
    void Run();
};

class Car : private Engine
{
public:
    void Drive()
    {
        // let engine go!
        Run();
    }
};
在关系描述上,等同于组合,如:

class Car
{
    ...
private:
    Engine m_engine;
}

  • 私有继承VS组合

私有继承带来过多的程序开销,而组合却是短平快,所以一般来说,设计者想描述Has-A的关系时,组合方式是首选的

但以下两种方式则必须使用私有继承:

  1. A类需要使用B类的protected成员函数来实现自己的功能时
  2. A类需要重写B类的虚函数时




谈谈C++私有继承