我有一个班级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
}
答案 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)
有两种方法可以解决这个问题:
_parentClassMethod()
最好的方法是覆盖该功能。
第二种方法的意思是:
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
。