2012-05-01 11 views
-1

可能性の重複:
How to force child same virtual function call its parent virtual function firstを実行し、基本クラスの機能と、その後継承されたクラスの機能

EDITの人々は完全にポイントを逃している:クラスの多くが継承している場合、私はあるになっていた何ベース、私は毎晩Base::myFunction()に電話する必要はありません!


私はどの単語この質問をする本当にわからないんだけど、私はそれがコード(これは実際に私はすぐにそれを書いた、コンパイルされない場合があります)から明らかに願っています:

class Base 
{ 
    bool flag = false; 

    void myFunction() 
    { 
     flag = true; 

     // here run the inherited class's myFunction() 
    } 
}; 

class A : public Base 
{ 
    void myFunction() 
    { 
     // do some clever stuff without having to set the flags here. 
    } 
}; 

int main() 
{ 
    A myClass; 
    myClass.myFunction(); // set the flags and then run the clever stuff 
    std::cout << myClass.flag << endl; // should print true 
    return 0; 
} 
+0

あなたは 'virtual void myFunction'を意味しましたか? – Thomas

+0

説明するには[C++ faq](http://www.parashift.com/c++-faq-lite/virtual-functions.html#faq-20.5)を参照してください – EdChum

答えて

4

まず、ポインターを使用する場合は、ケースの仮想関数を使用します。 次に、派生クラスの実現で、基本クラスmyFunctionを呼び出すだけです。 例を参照してください:

class Base 
{ 
    bool flag = false; 

    virtual void myFunction() 
    { 
     flag = true; 
    } 
}; 

class A : public Base 
{ 
    virtual void myFunction() 
    { 
     Base::myFunction(); // call base class implementation first 
     // do some clever stuff without having to set the flags here. 
    } 
}; 

int main() 
{ 
    A myClass; 

    myClass.myFunction(); // set the flags and then run the clever stuff 

    std::cout << myClass.flag << endl; // should print true 

    return 0; 
} 

あなたはすべての派生クラスで自分の基底クラスの関数を呼び出すのが好きではない場合。 「巧妙な」計算に特別な仮想関数を追加し、派生したすべてのクラスで個別に実現することができます。 例:継承構造のおかげで

class Base 
{ 
    bool flag = false; 

    virtual void cleverCalc() = 0; 
    virtual void myFunction() 
    { 
     flag = true; 
     cleverCalc(); 
    } 
}; 

class A : public Base 
{ 
    virtual void cleverCalc() 
    { 
     // do some clever stuff without having to set the flags here. 
    } 
}; 
+0

私はすでにこの方法を知っていて、それを避けたいと思っていました....しかし、その最も近い答えで、私はそれを受け入れます。 – Cheetah

3
class A : public Base 
{ 
    void myFunction() 
    { 
     Base::myFunction(); // <------------------------------- 
     // do some clever stuff without having to set the flags here. 
    } 
}; 
+0

クラスの多くがBaseを継承している場合、私は何を得ていましたか全ての単一インスタンスに対して 'Base :: myFunction()'を呼び出す必要はありません! – Cheetah

+0

@Ben次に、アクションをコンストラクタの一部にします。これが、基本クラスから何かを実際に自動的に呼び出す唯一の方法です。 – chrisaycock

+0

@chrisaycock - 私がしたいことはできません...ありがとう。 – Cheetah

0

、派生クラスでMyFunctionを()の呼び出しは、このようにフラグが設定されることはない、基本クラスでバージョンの呼び出しを排除する「真」。

2

空の実装(サブクラスでオーバーライドされる)で別の関数を作成し、myFunctionで呼び出します。このようなもの:

class Base 
{ 
    bool flag = false; 

    void myFunction() 
    { 
     flag = true; 

     // here run the inherited class's myFunction() 
     myDerivedFunction(); 
    } 

    virtual void myDerivedFunction() 
    { 
     // this should be implemented by subclasses. 
    } 
}; 

class A : public Base 
{ 
    void myDerivedFunction() 
    { 
     // do some clever stuff without having to set the flags here. 
    } 
}; 
+0

+1強制的にサブクラスを実装すると、 'myDerivedFunction()'を純粋仮想にすることができます。 – hmjd

関連する問題