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我正在空白,但是除了重新定义整个课堂之外_parentClassMethod,还有更好的方法吗?Child

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

有两种方法可以解决这个问题:

  1. 覆盖子类中的方法/函数。
  2. 定义一个开关,使它在父类的_parentClassMethod()

最好的方法是覆盖该功能。

我所说的第二种方法是:

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并在 Child 中覆盖。

于 2012-10-18T20:31:35.303 回答