读书笔记:Effective C++ 炒冷饭 - Item 34 接口?实现?谢谢!

读书笔记:Effective C++ 炒冷饭 - Item 34 接口?实现?谢谢!

[原创文章欢迎转载,但请保留作者信息]
Justin 于 2010-01-21

Scott 在这一章讲述了子类继承父类接口和实现的三种方式:

  1. 父类仅提供接口。将接口函数定义为纯虚函数就可以实现这一继承方式,因为子类必须为父类的纯虚函数提供具体的实现。这等于对子类说:接口已经给你定义好了,就按照这样写,去吧,好好干。
  2. 父类提供接口,以及一个默认的实现方式。在这种方式中,函数接口被定义为一个普通的虚函数,它在父类中就有实现。子类对象可以重新谱写不一样的函数内容(但接口的形式不变),也可以偷偷懒,直接拿来主义,用父类的实现就好了。
  3. 父类提供接口,同时还绑定了实现方式。这种情况下的接口函数其实就是一个普通的非虚函数,子类对象只有接受的义务,没有重新定义哪怕修改的权利。
下面简单的例子分别说明了上面的三种情况:
class  AClass {
public :
   
virtual   void  interface_1()  =   0 ;
   
virtual   void  interface_2()
   
{ /* the default implementation..*/
}
    void  interface_3()
   
{ /* the compulsory implementation..*/
}
// ..
}
;

class  AClassDerived {
public :
   
virtual   void  interface_1()
   
{ /* OK you have to implement this..*/
}
    virtual   void  interface_2()
   
{ /* you can, but don't have to implement this..*/
}
    //  void interface_3()
   
//  {you can't implement your own..}

}
;

以上就是今天课堂的主要内容。同时Scott还提到了一种介于1和2之间的实现方式:就当成是1.5吧。这样做的好处是:对于子类来说,父类提供了完整的接口,以及默认的实现方式(非公有的,不用担心具体实现被泄露);同时子类必须显式地说明是要采用默认的实现,还是要自己写。避免了因为忘记实现子类的接口函数而“不知不觉”地用了父类的接口实现。

class  AClass {
public :
   
virtual   void  interface_1. 5 ()  =   0 ;
// ..
protected :
   
void  default_interface_1. 5 ()
   
{ /* ..*/
}
// ..
}
;

class  AClassDerived {
public :
   
virtual   void  interface_1. 5 ()
   
{
      
// you can either do this
      default_interface_1. 5 ();
      
// or implement in your own way..
   }

// ..
}
;

除此之外,其实大师还提到了1.5的另外一种实现:声明一个纯虚函数作为接口,然后再为该纯虚函数定义实现。但是我窃以为这种方法实在过于诡异(为纯虚函数定义实现),而且如大师所说这样做的同时也暴露了接口的实现(因为这种情况下的实现是公有的),想了一下,还是不记了。若真有必要,去看书罢。

你可能感兴趣的:(读书笔记:Effective C++ 炒冷饭 - Item 34 接口?实现?谢谢!)