有一个抽象类A,它有一个纯虚拟成员函数func()。存在大量派生类,每个派生类具有不同的func()实现。
现在想象一下,你想在每次调用func()时添加一个额外的任务,让我们独立于派生类说cout << "hello world";
。该任务也独立于func()的内容,因此它可以在func()之前,之后或甚至在func()的中间执行,只有在每次调用func()时它才会被执行。
c ++(11)是否允许以聪明的方式执行此操作?
我想到的最好的事情是在实现任务的父类中编写pre-func()方法,并在所有func()实现开始时将调用复制到pre-func()在派生类中。还有什么更好的吗?
答案 0 :(得分:4)
我相信你可以使用Non-virtual interface idiom
你有以下基类:
class A{
public:
void myFunc();
private:
virtual void myVirtualFunc();
}
特别是.cpp中的以下内容:
void A::myFunc(){
//stuff
myVirtualFunc();
//stuff
}
然后每个派生类都可以重新实现myVirtualFunc()
并更改其行为。虚拟是私有的,因此您可以保证不会在任何地方调用它,而是在基类定义的公共非虚拟中(保证每个调用需要运行的代码将被运行),并且私有可见性不会被调用不要阻止派生类重新实现它。派生类可以指定虚拟的内容,而不是在哪里(尽管@WhozCraig提到,派生类仍然可以将虚函数重新实现为公共)。
答案 1 :(得分:2)
如果我正确理解了这个问题,你可以使用一个选项来创建&#34; pre-func()&#34;基类中的方法并且具有该函数print&#34; Hello World&#34;然后调用&#34; func()&#34;。这样你的派生类都覆盖&#34; func()&#34;但是你通过&#34; pre-func()&#34;来调用API。 (显然我不会使用术语pre-func,因为它不再准确描述功能)