Effective C++ Item 34 Differentiate between inheritance of interface and inheritance of implementation

1422 ワード

1.メンバー関数のインタフェースは常に継承する.Item 32が言ったように、publicはis-aを意味するので、base classに対しては本当で、derived classに対しても本当です.
 
2.pure virtual関数を宣言する目的は、derived classがインタフェースのみを継承するようにすることです.
しかし、意外なことにpure virtual関数を定義することができます.これはdefaultとして実装される別の用途があります
 
3.impure virtual関数を宣言する目的は、derived classにインタフェースとデフォルトの実装を継承させることです.
  • ここでは特別な状況が発生します.もし一部のサブクラス(多くのサブクラス)がデフォルトの実装を歓迎し、少数のサブクラスが歓迎しない場合は?1つの実行可能な解法は、デフォルトの実装を歓迎しないサブクラスに対してvirtual functionを再ロードすることである.もちろんこれは解法です.私は反対しません.ただし、Item 18の条項によると、「make interfaces easy to use correctly and hard to use incorrectly」では、不注意なプログラマーがリロードを忘れてしまい、見られたくない結果を招く可能性があることを考慮しなければならないので、「インタフェースとデフォルトの実装は分離すべき」
  • というポリシーを使用します.
  • インタフェースとデフォルトのインプリメンテーションは、デフォルトのインプリメンテーションとして別の関数を定義し、サブクラスが呼び出す必要があることを意味する.しかし、この時また反対者が飛び出して、それは名前をつけなければならないのではないでしょうか.名前をつけることが大嫌いです.
  • はい、名前をつけるのは嫌いです.pure virtual関数を使用すると、タスク
  • を巧みに完了するという特徴を定義することができます.
    class ModeA: public Airplane {
    public:
        virtual void fly(const Airport& destination) {
            Airplane::fly(destination);
        }
    };