1

クラスChildを継承しているクラスがありParentます。クラスParentには仮想保護メソッドがあり_parentClassMethod(int a, int b)ます。このメソッドは、クラスのメソッドで使用されChildます。

void Child::_childClassMethod(int c, int d)
{
//some code
_parentClassMethod(int a, int b);
//some more code
}

私の問題は次のとおりです。に、クラス_parentClassMethodから呼び出されたときに別の方法で実行する必要のある関数呼び出しがあります。私は空白にしていますが、クラスChild全体を再定義する以外に、それを行うためのより良い方法はありますか?_parentClassMethodChild

parentClassMethodの定義:

void Parent::_parentClassMethod(int a, int b){
//lots of other code
setSomethingFunction(val1, val2, val3);/*this function cannot be made virtual since it               writes to the eeprom of a device*/
//lot more code
}
4

5 に答える 5

6

子メソッドから親メソッドを呼び出したい場合は、次のように実行できます。

void Child::themethod(int c, int d)
{
    Parent::themethod(c,d);
    // ...
}
于 2012-10-18T20:32:14.820 に答える
5

親で仮想関数を定義し、子クラスでそれをオーバーライドします(@ k-balloに感謝)。

class base {
public:
    virtual void f() { /* do parent thing */ }
    void _parentClassMethod(int a, int b) {
        // something
        f();
        // more stuff
    }
};

class derived : public base {
public:
    virtual void f() { /* do child thing */ }
};
于 2012-10-18T20:24:36.340 に答える
1

これを解決するには2つの方法があります。

  1. 子クラスのメソッド/関数をオーバーライドします。
  2. 親クラスで異なる動作をするようにスイッチを定義します_parentClassMethod()

最良の方法は、関数をオーバーライドすることです。

2番目の方法の意味は次のとおりです。

void Parent::_parentClassMethod(int a, int b, int switchx)
{
   switch(switchx){
     case 0:
       /*behave normally*/ break;
     case 1:
       /*behave abnormally*/break;
   }
}
于 2012-10-18T20:23:32.330 に答える
0

setSomethingFunction()をオーバーライドできない場合は、_parentClassMethod()をオーバーライドするだけです。

于 2012-10-18T20:30:16.063 に答える
0

このタスク用に作成されたばかりのデザインパターンがあります:テンプレートメソッドパターン

仮想化したくないメソッドを呼び出す仮想メソッドを作成します。

class Parent {
  virtual void _parentClassMethod(int a, int b);
protected:
  virtual void _parentClassMethodSetSth(val1, val2, val3, ...)
  {
      setSomethingFunction(val1, val2, val3);
  }

};

void Parent::_parentClassMethod(int a, int b){
  //lots of other code
  _parentClassMethodSetSth(val1, val2, val3);
  //lot more code
}

_parentClassMethodSetSthそして、子でオーバーライドします。

于 2012-10-18T20:31:35.303 に答える