我正在寻找避免"召唤超级"代码气味的方法.当重新实现该函数时,需要子类来调用超类的虚函数版本时,会出现此代码异味.
class Base
{
public:
virtual void foo(){ ... }
}
class Derived : public Base
{
public:
virtual void foo(){ Base::foo();// required! ... }
}
Run Code Online (Sandbox Code Playgroud)
如果继承只有一层深,我可以使用模板方法
class Base
{
public:
void foo(){ ... ; foo_impl(); }
protected:
virtual void foo_impl(){}
}
class Derived : public Base
{
protected:
virtual void foo_impl(){ ... }
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我需要继承Derived,我会回到我开始的地方.
我正在考虑注册方法.
class Base
{
public:
Base()
{
_registerCallback( [this](){ _baseFoo(); } );
}
void foo()
{
for( auto f : _callbacks )
f();
} …Run Code Online (Sandbox Code Playgroud)