让f1
成为类c
的虚拟非抽象方法,f2
是类c
的方法。
也让{ {1}}是基类c_derived
中的派生类。
假设c
中的f1
被覆盖。如何从c_derived
中的方法f1
调用c_derived
的方法f2
(被覆盖)?
可能的解决方法。将函数指针参数添加到c
参数列表,创建c::f2
的包装c_derived::w
,并传递函数来自包装器c::f2
的{{1}}到c_derived::f1
的指针。
相反,是否有合理的方法来执行此操作?
答案 0 :(得分:3)
这很棘手,但可以通过一些黑客来完成:
void c::f2()
{
f1(); // if f1 is overriden in a class deriving from c,
// the derived class version is called
}
要调用基类版本(c::f1
),您需要完全限定通话 - c::fi()
。
答案 1 :(得分:2)
尽管Luchian Grigore给出了很好的答案,但我想指出这个想法是template method pattern背后的想法。
该模式允许派生类决定如何完成算法实现,或者通过虚拟方法的形式提供默认解决方案,或者通过使用纯虚方法提供解决方案。
在上述两种情况中,f2
成员调用f1
成员的正确实现,如下所示:
f1();
知道解决方案的名称通常是有用的。