2

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

现在想象一下,您想在每次调用 func() 时添加一个要执行的额外任务,假设一个cout << "hello world";独立于派生类的任务。该任务也独立于 func() 的内容,因此它可以在 func() 之前、之后甚至中间执行,只有在每次调用 func() 时才会执行它这一事实很重要。

c++(11) 是否允许以聪明的方式做到这一点?

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

4

2 回答 2

4

我相信你可以使用非虚拟接口成语

您将拥有如下基类:

class A{

public:
    void myFunc();

private:
    virtual void myVirtualFunc();
}

.cpp 中特别包含以下内容:

void A::myFunc(){
    //stuff
    myVirtualFunc();
    //stuff
}

然后每个派生类可以重新实现myVirtualFunc()和改变它的行为。虚拟是私有的,因此您可以保证它不会在任何地方被调用,而是在基类定义的公共非虚拟中调用(保证您需要为每次调用运行的代码将被运行),并且私有可见性不会'不要阻止派生类重新实现它。派生类可以指定虚函数做什么,而不是在哪里(尽管如@WhozCraig 所述,派生类仍然可以将虚函数重新实现为公共)。

于 2013-09-09T15:00:25.950 回答
2

如果我正确理解了这个问题,您可以使用的一种选择是在基类中创建“pre-func()”方法并让该函数打印“Hello World”,然后调用“func()”。这样,您的派生类都将覆盖“func()”,但您通过“pre-func()”调用 API(显然我不会使用术语 pre-func,因为它不再准确地描述功能)

于 2013-09-09T15:04:28.473 回答