C++ “错误”;称为“的纯虚拟方法”;,当此方法已被重写时

C++ “错误”;称为“的纯虚拟方法”;,当此方法已被重写时,c++,oop,derived-class,C++,Oop,Derived Class,我正在尝试实践“观察者设计模式”。当我认为抽象的纯虚方法已被其派生类重写时,发生了一个错误 独立文件中有一个作为抽象类的观察者: \ifndef设计模式\u观察者\u H #定义设计模式观察者 #包括“subject.h” 班级科目; 类观察员{ 受保护的: 观察员(); 公众: 虚拟观察者(); 虚拟作废更新(主体*变更主体)=0; }; 观察者::观察者(){} 观察者::~Observer(){} #endif//DESIGN\u PATTERNS\u OBSERVER\H 观察者定义了

我正在尝试实践“观察者设计模式”。当我认为抽象的纯虚方法已被其派生类重写时,发生了一个错误

独立文件中有一个作为抽象类的观察者:

\ifndef设计模式\u观察者\u H
#定义设计模式观察者
#包括“subject.h”
班级科目;
类观察员{
受保护的:
观察员();
公众:
虚拟观察者();
虚拟作废更新(主体*变更主体)=0;
};
观察者::观察者(){}
观察者::~Observer(){}
#endif//DESIGN\u PATTERNS\u OBSERVER\H
观察者定义了一个纯虚拟方法“更新”,该方法覆盖如下内容:

\ifndef设计\u模式\u具体\u观察者\u H
#定义设计模式、具体模式、观察者
#包括
#包括“observer.h”
#包括“具体主题h”
类观察者:公共观察者{
公众:
无效更新(主题*更改的主题)覆盖{
自动cs=动态施法(被改变的主题);
标准::不能移除(o);
}
void Subject::notify(){
(观察员*观察员:*_观察员){
//这里是错误出现的地方,由调试发现
观察者->更新(本);
}
}
#endif//DESIGN\u PATTERNS\u SUBJECT\H
它有一个派生类“ConcreteSubject”:

\ifndef设计模式\u具体\u主题\u H
#定义设计模式、具体主题
#包括“subject.h”
班级主题:公共主题{
私人:
智力状态;
公众:
具体主题(){
状态=0;
}
无效集_状态(int s){
此->状态=s;
主题::notify();
}
int get_status(){
返回状态;
}
};
#endif//DESIGN\u PATTERNS\u CONCRETE\u SUBJECT\H
主要功能:

#包括
#包括
#包括“singleton.h”
#包括“观察员/具体对象h”
#包括“观察员/混凝土_observer.h”
void test2(){
具体主体具体主体;
向量观测器;
对于(int i=0;i<5;++i){
ConcreteObserver=ConcreteObserver();
具体主题。附加(&观察员);
观察员。推回(观察员);
}
具体对象。设置_状态(2);
}
int main(){
test2();
返回0;
}
正如我之前提到的,ConcreteSubject的超类Subject的_观察器应该存储ConcreteObservators的指针,这些指针已经覆盖了“update”。 我不明白为什么观察家的“更新”仍然被调用

这是另一件奇怪的事情。我做了一个小测试,测试的类之间的关系与我展示的几乎相同。但是没有发生错误

ABaseA类{
公众:
虚拟void do_some()=0;
};
MidA类:公共海洋{
公众:
void do_some()覆盖{
做不到;
}
}
};
MidB类:公共ABaseB{
公众:
MidB()=默认值;
无效活动(){
ABaseB::do_active();
}
};
void test3(){
迈达迈达;
MidB-MidB;
midB。添加(&midA);
midB.active();
}

唯一的区别是该代码在一个文件中。

在Subject.h文件中,您应该将以下代码传输到Subject.cpp:

Subject::Subject() {
    _observers = new std::list<Observer*>;
}

Subject::~Subject() {
    delete _observers;
}

void Subject::attach(Observer *o) {
    _observers->push_back(o);
}

void Subject::detach(Observer *o) {
    _observers->remove(o);
}

void Subject::notify() {
    for (Observer* observer : *_observers) {
//here is where error comes out, found by debug
        observer->update(this);
    }
}

concreteSubject.附加(&observer)想想那个循环中
观察者
对象的生存期。这正是产生错误的地方。我并没有考虑分布在堆栈上的变量的生存期。
#include <list>
#include "Observer.h"

class Observer; //you should be add this line
class Subject {
private:
    std::list<Observer*> *_observers;

protected:
    Subject();

public:
    virtual ~Subject();
    virtual void attach(Observer*);
    virtual void detach(Observer*);
    virtual void notify();
};