覆盖扩展现有函数的方法

时间:2012-10-18 20:20:02

标签: c++ inheritance override

我有一个班级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
}

5 个答案:

答案 0 :(得分:6)

如果要从子方法调用父方法,可以执行以下操作:

void Child::themethod(int c, int d)
{
    Parent::themethod(c,d);
    // ...
}

答案 1 :(得分: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 */ }
};

答案 2 :(得分:1)

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

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

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

    第二种方法的意思是:

    void Parent::_parentClassMethod(int a, int b, int switchx)
    {
       switch(switchx){
         case 0:
           /*behave normally*/ break;
         case 1:
           /*behave abnormally*/break;
       }
    }
    

答案 3 :(得分:0)

如果你不能覆盖setSomething Function(),那么只需覆盖_parent ClassMethod()。

答案 4 :(得分:0)

为此任务创建了一个设计模式:Template method pattern

创建调用您不想虚拟的方法的虚方法:

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
}

并覆盖Child中的_parentClassMethodSetSth