虚函数之间共享的代码

时间:2013-09-09 14:56:20

标签: c++ inheritance methods

有一个抽象类A,它有一个纯虚拟成员函数func()。存在大量派生类,每个派生类具有不同的func()实现。

现在想象一下,你想在每次调用func()时添加一个额外的任务,让我们独立于派生类说cout << "hello world";。该任务也独立于func()的内容,因此它可以在func()之前,之后或甚至在func()的中间执行,只有在每次调用func()时它才会被执行。

c ++(11)是否允许以聪明的方式执行此操作?

我想到的最好的事情是在实现任务的父类中编写pre-func()方法,并在所有func()实现开始时将调用复制到pre-func()在派生类中。还有什么更好的吗?

2 个答案:

答案 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,因为它不再准确描述功能)