c++ - 空覆盖 C++11

标签 c++ c++11 overriding listener

有观察者模式。

class Observer
{
   virtual eventA()=0;
   virtual eventB()=0;
    ...
   virtual eventZ()=0;
}

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

class MyObserver{
    eventA() override {}
    eventB() override { /* Do something */ }
    eventC() override {}
    ...
    eventZ() override {}
}

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

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

...
eventC() override = empty;
...

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

最佳答案

您要查找的内容不存在。

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

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

Observer::~Observer() { }

struct MyObserver: Observer {
    void eventB() override { /* Do something */ }
};

给你:

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

  • 所有方法的默认空实现

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

因此,结果是:

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

好吧,但你是这么说的:

The Observer class cannot be changed

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

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 */ }
};

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

关于c++ - 空覆盖 C++11,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38302354/

相关文章:

c++ - 为什么 “using namespace std;”被视为不良做法?

c++ - 什么是 "Expression SFINAE"?

ios - Swift:只能在类成员上指定覆盖

c++ - qStableSort 是否保留等效元素的顺序?

c++ - 如何计算给定 IPv4 网络掩码的前缀长度?

c++ - 使用 const 键从集合中删除元素

C++11 Xcode 5 : linking error

c++ - gcc 的 __float128 float 是否考虑了当前的舍入模式?

java - 这是什么类型的 Java 构造函数调用?

ios - 无法通过主类的选择器调用类别方法