C++中,表达“is implemented in terms of(根据某物实现出)”关系有两种方法:复合与private继承。
复合很好理解,就是在类中包含另一个类对象,这在面向对象设计中是常用的方法。
class Address {...}; class Person { public: ... private: Address address; };
与public继承不同,private继承不代表基类和子类之间的“is-a”关系,它往往意味着子类“is implemented in terms of”基类。
class Timer { public: explicit Timer(int tickFrequency); virtual void onTick() const; }; class Widget:private Timer { private: virtual void onTick() const; }
在上面的代码例子中,Widget类需要用到Timer类中的一部分功能,于是它私有继承了Timer类,并重载了Timer的onTick函数。
相比于复合,私有继承的好处在于,它可以访问基类的protected成员,并重载基类的virtual函数。但这利用复合实际上也可以做到,如下所示:
class Widget{ private: class WidgetTimer:public Timer { public: virtual void onTick() const; }; WidgetTimer timer; }
这样是不是更灵活了?这样设计,可以使该类的子类无法再继续重载onTick函数,有点类似Java里的final功能。而且,这样实现可以降低代码的编译依存性。