从抽象 class 覆盖虚方法

Override virtual method from abstract class

我需要测试基于观察者模式的通知系统。这是我的 Observer class:

template <typename DataType>
class Subject;

template <typename DataType>
class Observer {
public:
    virtual ~Observer() {}
    virtual void receive(Subject<DataType> *subject) = 0;
};

DataType 是 tparam 数据。 receive()更新时会接收并处理Subject调用的消息。 Subject 是指向数据来源主题的指针。

这里是 Subject class 的一部分 attach() 方法:

template <typename DataType>
class Subject {
public:
    typedef Observer<DataType> SameDataObserver;

    Subject():
        dataPtr_(NULL),
        observers_() {
    }

    void attach(SameDataObserver *observerPtr) {
        assert(observerPtr != NULL);
        observers_.pushBack(observerPtr);
    }
...
private:
...
};

所以,我写了一个Observer摘要的继承者class。我想在这里我只需要定义 receive() 方法:

class TestObserver : Observer<IdString> {
    virtual void receive(Subject<DataType> *subject) override {};
};

IdStringtypedef String<64> IdString;.

在我的 main() 函数中,我这样做:

const IdString data = "button pressed";
Subject<IdString> subject;
TestObserver<IdString> testObserver;
subject.attach(&testObserver);

这是我得到的错误:

[build] /home/a.wise/Downloads/test_notifying_system/test_notifying_system.cpp:20:32: error: no matching function for call to ‘Subject<String<64> >::attach(TestObserver<String<64> >&)’
[build]      subject.attach(testObserver);
[build]                                 ^
[build] In file included from /home/a.wise/Downloads/test_notifying_system/test_notifying_system.cpp:7:0:
[build] /home/a.wise/Downloads/test_notifying_system/src/notifying_system/subject.h:29:10: note: candidate: void Subject<DataType>::attach(Subject<DataType>::SameDataObserver*) [with DataType = String<64>; Subject<DataType>::SameDataObserver = Observer<String<64> >]
[build]      void attach(SameDataObserver *observerPtr) {
[build]           ^~~~~~

我漏了public个字,正确的代码:

template <typename DataType>
class TestObserver : public Observer<IdString> {
    public:
    virtual void receive(Subject<DataType> *subject) override {};
};

之后编译