八叶一刀·无仞剑

万物流转,无中生有,有归于无

导航

类中的“根据某物实现出”关系

Posted on 2016-12-29 14:39  闪之剑圣  阅读(150)  评论(0编辑  收藏  举报

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功能。而且,这样实现可以降低代码的编译依存性。