C ++継承の仮想クラスメンバーのコード重複を削除します

パイの人生

私は今、奇妙な問題に直面しています。同じものの本当に単純化されたバージョンを書きます。

class Base
{
public:
  virtual int func1()=0;
  virtual int func2()=0;
protected:
  int n;
};

class der1: public Base
{
  // implements the virtual functions of the base and uses the protected data 
  // members of the base.
};

class der2: public Base
{
  // implements the virtual functions of the base and uses the protected data 
  // members of the base.
}

ここで問題は....両方でder1ありder2、baseの仮想関数をほぼ同じ方法で実装します。しかし、他のいくつかのクラス(der3der4)には独自の実装があります。しかし、それでもベースから継承する必要があります。コードをリファクタリングして、コードの重複をおっと削除するにはどうすればよいですか?

すべてが流れる

別の抽象基本クラスの中間層を使用する1つのソリューションを次に示します。

class Base12 : public Base {
protected: 
    int commonFuncStuffA() {
       // Commonly used stuff 
    }

    int commonFuncStuffB() {
    }
};

class der1: public Base12
{
public:
    virtual int func1() {
        n = commonFuncStuffA();
    }
    virtual int func2() {
        n = somethingElse;
    }
};

class der2: public Base12
{
public:
    virtual int func1() {
        n = commonFuncStuffA();
    }
    virtual int func2() {
        n = commonFuncStuffB();
    }
};

ただし、実際の本番コードの設計で行うことは少し異なります。

  1. 純粋仮想関数のインターフェースを宣言します

    struct IMyInterface {
        virtual int func1() = 0;
        virtual int func2() = 0;
        virtual ~IMyInterface {}
    };
    
  2. 一般的に使用されるデータメンバーと関数を含む抽象基本クラスを提供します

    class BaseImpl : public IMyInterface {
    protected: 
        int n;
        int commonFuncStuffA() {
            // Commonly used stuff 
        }
    
        int commonFuncStuffB() {
            // Commonly used stuff 
        }
    };
    
  3. 最終的に派生したクラスでインターフェイスの実装を提供します

    class der1: public BaseImpl {
    public:
        virtual int func1() {
            n = commonFuncStuffA();
        }
        virtual int func2() {
            n = somethingElse;
        }
    };
    
    
    class der2: public BaseImpl {
    public:
        virtual int func1() {
            n = commonFuncStuffA();
        }
        virtual int func2() {
            n = commonFuncStuffB();
        }
    };
    
    class der3: public IMyInterface {
    public:
        virtual int func1() {
            // Some completely different implementation of the interface
        }
        virtual int func2() {
            // Some completely different implementation of the interface
        }
    };
    
    class der4: public IMyInterface {
    public:
        virtual int func1() {
            // Some completely different implementation of the interface
        }
        virtual int func2() {
            // Some completely different implementation of the interface
        }
    };
    

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

仮想継承中のC ++コンストラクターの順序

分類Dev

C ++の継承:オーバーライドされたときに仮想メソッドを呼び出す

分類Dev

C ++継承設計:メンバーの重複を回避する

分類Dev

継承:コンストラクター、C ++ 11の基本クラスの配列メンバーのようにCを初期化します

分類Dev

C ++の基本クラスと派生クラスの「仮想」コンストラクターを宣言しますか?

分類Dev

c#:継承された基本メソッドを呼び出すときの制御の流れ。継承された基本メソッドは、派生クラスで新規に設定された基本仮想メソッドを呼び出します。

分類Dev

同じ純粋仮想メソッドを使用した、異なる抽象ベースからのC ++多重継承

分類Dev

C ++:テンプレートクラスの仮想関数を正しくオーバーライドする

分類Dev

C ++仮想クローンメソッド、例外継承

分類Dev

仮想メソッドのオーバーライドからベースメソッドへの呼び出しを奨励または阻止するためのC#属性またはコード検査コメント

分類Dev

仮想デストラクタなしのC ++継承

分類Dev

コンストラクターc#での仮想メンバー呼び出し

分類Dev

TypeScriptのc#クラス仮想メンバーに相当

分類Dev

C ++の継承とクラスメンバー

分類Dev

テンプレート仮想クラスc ++への参照を作成します

分類Dev

C ++の継承:派生クラスのインスタンスを使用して基本クラスの仮想関数を呼び出す

分類Dev

コンストラクターでの仮想メソッドの呼び出し:JavaとC ++の違い

分類Dev

DLLからの仮想クラスインターフェイスの継承(C ++)

分類Dev

「this」へのポインタをベースコンストラクタに渡すことにより、C ++ダイヤモンド継承を排除します

分類Dev

C#ジェネリックス:派生クラスの非表示の継承メンバーを変更する

分類Dev

C ++同様の仮想パブリッククラスのメンバー関数を使用する

分類Dev

c++ は、継承ツリーのいくつかのクラスに追加のインターフェースを導入するときに、コードの重複を避ける

分類Dev

C ++は、パラメーターとして抽象クラスを使用して仮想メソッドをオーバーライドします

分類Dev

Cドライブのディスクイメージを作成し、VMware仮想マシンで実行します

分類Dev

基本クラスの非仮想C#メソッドでも、vtableのオーバーヘッドが発生しますか?

分類Dev

C ++仮想継承とコンストラクタ

分類Dev

C ++は(仮想)プライベート基本クラスをコンパイラーで削除できますか?

分類Dev

C ++ Structとその継承メンバーのデフォルトコンストラクターを呼び出す

分類Dev

C ++:同じクラスのメンバー関数から純粋仮想関数を呼び出す

Related 関連記事

  1. 1

    仮想継承中のC ++コンストラクターの順序

  2. 2

    C ++の継承:オーバーライドされたときに仮想メソッドを呼び出す

  3. 3

    C ++継承設計:メンバーの重複を回避する

  4. 4

    継承:コンストラクター、C ++ 11の基本クラスの配列メンバーのようにCを初期化します

  5. 5

    C ++の基本クラスと派生クラスの「仮想」コンストラクターを宣言しますか?

  6. 6

    c#:継承された基本メソッドを呼び出すときの制御の流れ。継承された基本メソッドは、派生クラスで新規に設定された基本仮想メソッドを呼び出します。

  7. 7

    同じ純粋仮想メソッドを使用した、異なる抽象ベースからのC ++多重継承

  8. 8

    C ++:テンプレートクラスの仮想関数を正しくオーバーライドする

  9. 9

    C ++仮想クローンメソッド、例外継承

  10. 10

    仮想メソッドのオーバーライドからベースメソッドへの呼び出しを奨励または阻止するためのC#属性またはコード検査コメント

  11. 11

    仮想デストラクタなしのC ++継承

  12. 12

    コンストラクターc#での仮想メンバー呼び出し

  13. 13

    TypeScriptのc#クラス仮想メンバーに相当

  14. 14

    C ++の継承とクラスメンバー

  15. 15

    テンプレート仮想クラスc ++への参照を作成します

  16. 16

    C ++の継承:派生クラスのインスタンスを使用して基本クラスの仮想関数を呼び出す

  17. 17

    コンストラクターでの仮想メソッドの呼び出し:JavaとC ++の違い

  18. 18

    DLLからの仮想クラスインターフェイスの継承(C ++)

  19. 19

    「this」へのポインタをベースコンストラクタに渡すことにより、C ++ダイヤモンド継承を排除します

  20. 20

    C#ジェネリックス:派生クラスの非表示の継承メンバーを変更する

  21. 21

    C ++同様の仮想パブリッククラスのメンバー関数を使用する

  22. 22

    c++ は、継承ツリーのいくつかのクラスに追加のインターフェースを導入するときに、コードの重複を避ける

  23. 23

    C ++は、パラメーターとして抽象クラスを使用して仮想メソッドをオーバーライドします

  24. 24

    Cドライブのディスクイメージを作成し、VMware仮想マシンで実行します

  25. 25

    基本クラスの非仮想C#メソッドでも、vtableのオーバーヘッドが発生しますか?

  26. 26

    C ++仮想継承とコンストラクタ

  27. 27

    C ++は(仮想)プライベート基本クラスをコンパイラーで削除できますか?

  28. 28

    C ++ Structとその継承メンバーのデフォルトコンストラクターを呼び出す

  29. 29

    C ++:同じクラスのメンバー関数から純粋仮想関数を呼び出す

ホットタグ

アーカイブ