如何解决在继续派生函数之前执行基函数
| 我正在尝试解决一个问题,在这个问题中,我需要一些类来完成一些常见的工作,然后执行一堆针对特定问题的工作,完成这些后,还要对所有这些类进行更多的处理。 我有一个基类和派生类,它们都有一个称为Execute的函数。当我调用此函数的派生版本时,我希望能够对Base中所有派生类进行一些通用的处理,然后继续在Derived :: Execute中执行并返回到Base :: Execute以执行以下操作:完成一些常见的工作。 在C ++中这有可能吗?如何最好地做到这一点? 这是个主意,但是这样可能不太可行:class Base
{
public:
virtual void Execute();
};
Base::Execute() {
// do some pre work
Derived::Execute(); //Possible????
// do some more common work...
}
class Derived : public Base
{
public:
void Execute();
};
void Derived::Execute()
{
Base::Execute();
//Do some derived specific work...
}
int main()
{
Base * b = new Derived();
b.Execute(); //Call derived,to call into base and back into derived then back into base
}
解决方法
使用基本的纯虚函数。
class Base
{
public:
void Execute();
private:
virtual void _exec() = 0;
};
Base::Execute() {
// do some common pre work
// do derived specific work
_exec();
// do some more common work...
}
class Derived : public Base
{
private:
void _exec() {
// do stuff
}
};
int main()
{
Base * b = new Derived();
b.Execute();
}
编辑:阅读更多问题后稍稍改变了流程..::)上面的机制应该完全符合您现在所需要的
即
基础共同的东西
派生特定的东西
再次基础共同的东西
,这在C ++中被称为NVI(非虚拟接口,从Herb Sutter那里过来)习惯用语,基本上说您不应该具有公共虚拟功能,而应该具有受保护/私有虚拟功能。用户代码将必须在基类中调用您的公共非虚拟函数,并将其分派到受保护/私有虚拟方法。
从设计的角度来看,基本原理是基类具有两个不同的接口,一方面是由该类的公共子集确定的用户界面,另一方面是可扩展性接口或如何扩展该类。通过使用NVI,您可以解耦两个接口并允许在基类中进行更大的控制。
class base {
virtual void _foo(); // interface to extensions
public:
void foo() { // interface to users
// do some ops
_foo();
}
};
,将问题从头转向脚。您真正想要的是派生类可以插入的基类算法:
class Base {
public:
void Execute()
{
// do something
execute();
// do some more things
}
private:
virtual void execute() = 0;
};
class Derived : public Base {
public:
// whatever
private:
virtual void execute()
{
//do some fancy stuff
}
};
让派生类插入基类算法通常称为“模板方法”模式(与ѭ4无关)。在基类接口中没有公共虚函数通常称为“非虚拟接口”模式。
我相信Google可以在这两个方面找到很多东西。
,在两个函数中内部移动Base::Execute
,然后使用RAII轻松实现。
class Base{
protected:
void PreExecute(){
// stuff before Derived::Execute
}
void PostExecute(){
// stuff after Derived::Execute
}
public:
virtual void Execute() = 0;
};
struct ScopedBaseExecute{
typedef void(Base::*base_func)();
ScopedBaseExecute(Base* p)
: ptr_(p)
{ ptr_->PreExecute() }
~ScopedBaseExecute()
{ ptr_->PostExecute(); }
Base* ptr_;
};
class Derived : public Base{
public:
void Execute{
ScopedBaseExecute exec(this);
// do whatever you want...
}
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。