zoukankan      html  css  js  c++  java
  • Effective C++ 34 区分接口继承和实现继承

    public继承从根本上讲,有两部分:接口继承和实现继承。两者之前的区别很像函数声明与函数定义。

    具体设计中,会呈现三种形式:derived class只继承成员函数的接口(纯虚函数);derived class同时继承函数的接口和实现,同时能够重写(override);derived class同时继承函数的接口和实现,但是不允许重写该函数。

    1、只继承成员函数的接口(纯虚函数):

    例如pure函数

    2、同时继承函数的接口和实现,同时能够重写(override):

    例如impure函数,为了避免用户不想使用默认实现,但同时忘记重写该函数的情况发生,书中给出一种很nice的解决方案:声明为纯虚函数,但是给定默认实现,如果想用父类的默认实现,需要显示调用,如果不想用默认声明,需要自己定义。

    下面例子中的fly函数:

     1 class Airplane {
     2 public:
     3   virtual void fly(const Airport& destination) = 0;
     4   ...
     5 };
     6 void Airplane::fly(const Airport& destination)
     7 {
     8   飞机飞往某一目的地的缺省代码
     9 }
    10 class ModelA: public Airplane {
    11 public:
    12   virtual void fly(const Airport& destination)
    13   { Airplane::fly(destination); }
    14   ...
    15 };
    16 class ModelB: public Airplane {
    17 public:
    18   virtual void fly(const Airport& destination)
    19   { Airplane::fly(destination); }
    20   ...
    21 };
    22 class ModelC: public Airplane {
    23 public:
    24   virtual void fly(const Airport& destination);
    25   ...
    26 };
    27 void ModelC::fly(const Airport& destination)
    28 {
    29   ModelC飞往某一目的地的代码
    30 }

    3、同时继承函数的接口和实现,但是不允许重写该函数:

     例如non-virtual函数,这种实现方法强调不变性,即所有derived class 都应该继承base class的非虚函数,并应该遵循父类对该函数的实现方法。

  • 相关阅读:
    CodeForces:847D-Dog Show
    CodeForces 699C
    CodeForces:699B-One Bomb
    哈夫曼树:HDU5884-Sort(队列、哈夫曼树)
    Educational Codeforces Round 31- D. Boxes And Balls
    经典:区间dp-合并石子
    Codeforces Round #879 (Div. 2) C. Short Program
    卡顿
    异常断点
    自动布局
  • 原文地址:https://www.cnblogs.com/bigbigtree/p/3965724.html
Copyright © 2011-2022 走看看