空重写C ++ 11

FCR*_*FCR 5 c++ overriding listener c++11

具有观察者模式。

class Observer
{
   virtual eventA()=0;
   virtual eventB()=0;
    ...
   virtual eventZ()=0;
}
Run Code Online (Sandbox Code Playgroud)

Observer类不能更改,但是我的类仅对事件B感兴趣。因此,我需要:

class MyObserver{
    eventA() override {}
    eventB() override { /* Do something */ }
    eventC() override {}
    ...
    eventZ() override {}
}
Run Code Online (Sandbox Code Playgroud)

清空所有事件的开销,特别是如果您有一个始终要在cpp文件中实现的策略(显然是模板除外)时,这是开销。

C ++ 11是否为此提供任何关键字?喜欢

...
eventC() override = empty;
...
Run Code Online (Sandbox Code Playgroud)

这样,我就不需要在CPP文件中添加空的实现。

sky*_*ack 4

您正在寻找的内容不存在。

无论如何,你可以这样做:

struct Observer {
    virtual ~Observer() = 0;
    virtual void eventA() {}
    virtual void eventB() {}
    // ...
    virtual void eventZ() {}
};

Observer::~Observer() { }

struct MyObserver: Observer {
    void eventB() override { /* Do something */ }
};
Run Code Online (Sandbox Code Playgroud)

在这里你有:

  • Observer仍然是抽象的(感谢它的析构函数),所以你不能实例化这种类型的对象

  • 所有方法的默认空实现

  • 无需在派生类中为那些您不感兴趣的方法定义空主体

因此,结果是:

int main() {
    // This compiles and works as expected
    Observer *O = new MyObserver;
    // The following line doesn't compile
    // Observer *O = new Observer;
}
Run Code Online (Sandbox Code Playgroud)

好吧,但你说过:

观察者类无法更改

在这种情况下,您可以定义一个不可实例化的中间类来派生,例如:

struct IntermediateObserver: Observer {
    virtual ~IntermediateObserver() = 0;
    void eventA() override {}
    void eventB() override {}
    // ...
    void eventZ() override {}
};

IntermediateObserver::~IntermediateObserver() { }

struct MyObserver: IntermediateObserver {
    void eventB() override { /* Do something */ }
};
Run Code Online (Sandbox Code Playgroud)

从现在开始,从中派生所有自定义观察者,IntermediateObserver仅此而已。