2012-03-13 4 views
7

を呼び出して、手動で回避:C++私はこのようなクラスのセットを持って、基本クラスの機能

class A { 
public: 
    int DoIt() { 
    //common code 
    } 
}; 

class B : public A { 
    int DoIt() { 
    if (A::DoIt() == 1) { 
     return 1; 
    } 
    else { 
     // do b specific code 
    } 
    } 
}; 

class C : public A { 
    int DoIt() { 
    if(A::DoIt()==1) { 
     return 1; 
    } 
    else { 
     // do c specific code 
    } 
    } 
}; 

は、私は手動でこのコードを置くことを避けることができます方法はありますか:あるすべてのクラスで

if (A::Doit() == 1) { return 1; } else { 

Aから派生した?

+1

正しい構文は 'class B:public A'です。 C++はJavaではありません。 – kennytm

+0

@Justin OP:OPは、 'if(A :: Doit()== 1)が1を返すのを避ける方法を尋ねています。 } else {'をすべてのサブクラスで認識しないで' A :: Doit() 'を呼び出す方法ではありません。リンクされた質問は継承に関連するものではありません。 – kennytm

答えて

9

特定のコードを別のメソッド仮想メソッドに区切ります。

class A 
{ 
public: 
    int DoIt() /*final*/ 
    { 
     // common code 
     if (return_value == 1) 
      return 1; 
     else 
      return DoIt_specific(); 
    } 

private: 
    virtual int DoIt_specific() = 0; 
    //^or some "A"-specific actions if A cannot be abstract. 
}; 

class B : public A 
{ 
    virtual int DoIt_specific() /*override*/ 
    { 
     // specific code for B 
    } 
}; 

これはnon-virtual interfaceイディオムとして知られています。

関連する問題