You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

订阅多个同基类发布者时的重复基类编译错误解决方案求助

订阅多个同基类发布者时的重复基类编译错误解决方案求助

各位好,我最近在实现一个简单的发布-订阅模式时遇到了编译问题,想请教下怎么实现我的需求。

我想要让一个Handler类同时订阅DriverA和DriverB这两个发布者,并且能分别重载对应发布者的Notify方法,让两个发布者触发通知时,各自执行对应的处理逻辑。

我先写了这样一段代码:

#include <iostream>
#include <vector>

class Subscriber {
public:
    virtual void Notify(float f) = 0;
};

class Publisher {
public:
    constexpr void AddSubscriber(Subscriber* sub) {
        subs_.push_back(sub);
    };
    void Notify(float v) {
        for (auto& s : subs_) {
            if (s) {
                s->Notify(v);
            }
        }
    }
private:
    std::vector<Subscriber*> subs_;
};

class DriverA : public Publisher {
public:
    using Subscriber = ::Subscriber;
    void Activate(float f) {
        Notify(f);
    }
};

class DriverB : public Publisher {
public:
    using Subscriber = ::Subscriber;
    void Activate(float f) {
        Notify(f);
    }
};

class Handler : public DriverA::Subscriber, public DriverB::Subscriber {
public:
    constexpr Handler(DriverA& da, DriverB& db) {
        da.AddSubscriber(this);
        db.AddSubscriber(this);
    }
    float Val() const {
        return val_;
    }
private:
    void DriverA::Subscriber::Notify(float v) override {
        val_ = v;
        std::cout << "valA:" << v << std::endl;
    }
    void DriverB::Subscriber::Notify(float v) override {
        val_ = v;
        std::cout << "valB:" << v << std::endl;
    }
    float val_{};
};

int main() {
    DriverA da;
    DriverB db;
    Handler h{ da, db };
    da.Activate(3.14f);
    db.Activate(2.71f);
    return 0;
}

但编译时直接报错了,错误信息是:

main.cpp:37:61: error: duplicate base type ‘Subscriber’ invalid
37 | class Handler : public DriverA::Subscriber, public DriverB::Subscriber {

我原本以为如果两个发布者是不同类型,这样的写法能行,但现在发现DriverA::Subscriber和DriverB::Subscriber其实都是同一个基类::Subscriber,所以触发了重复基类的问题。

想请教大家:有没有办法实现我的需求——让Handler同时订阅这两个发布者,并且分别重载每个对应的Notify方法呢?

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 03:08:04