c++ - 选择要覆盖哪个基类的方法

标签 c++ inheritance multiple-inheritance observer-pattern

鉴于以下情况:

class Observer
{
    public:
        virtual void Observe(Parameter p) = 0;
};

template<size_t Tag>
class TaggedObserver : public Observer { };

class Thing : public TaggedObserver<0>, TaggedObserver<1>
{
    public:
        virtual void Observe(Parameter p) override;
};

Thing::Observe覆盖 TaggedObserver<0>::ObserveTaggedObserver<1>::Observe .
有没有办法为每个基类提供不同的覆盖?
理由:我希望该类能够观察两个相同类型的通知源,每个源具有不同的操作,而不必求助于在参数中传递源,然后在 if 中检查它。/switch .

最佳答案

为了提供不同的覆盖,需要定义不同的派生类,eg:

class Observer
{
public:
    virtual void Observe(Parameter p) = 0;
};

template<size_t Tag>
class TaggedObserver : public Observer
{
};

class TaggedObserverZero : public TaggedObserver<0>
{
public:
    virtual void Observe(Parameter p)
    {
        // do something ...
    }
};

class TaggedObserverOne : public TaggedObserver<1>
{
public:
    virtual void Observe(Parameter p)
    {
        // do something else ...
    }
};

但是,如果你想要Thing::Observe()接收Parameter首先并将其分派(dispatch)给适当的基类,你无法避免使用 if Thing 中的声明(或等效项) , 因为它继承了 TaggedObserver::Observe() 的多个拷贝并且需要决定调用哪一个:

class Thing : public Observer, TaggedObserverZero, TaggedObserverOne
{
public:
    virtual void Observe(Parameter p)
    {
        if (some condition)
            TaggedObserverZero::Observe(p);
        else if (some other condition)
            TaggedObserverOne::Observe(p);
    }
};

或者,你无条件地调用它们,让它们自己决定要做什么:

class TaggedObserverZero : public TaggedObserver<0>
{
public:
    virtual void Observe(Parameter p)
    {
        if (some condition)
            // do something ...
    }
};

class TaggedObserverOne : public TaggedObserver<1>
{
public:
    virtual void Observe(Parameter p)
    {
        if (some other condition)
            // do something else ...
    }
};

class Thing : public Observer, TaggedObserverZero, TaggedObserverOne
{
public:
    virtual void Observe(Parameter p)
    {
        TaggedObserverZero::Observe(p);
        TaggedObserverOne::Observe(p);
    }
};

关于c++ - 选择要覆盖哪个基类的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38271718/

相关文章:

c++ - 如何在 std::map 中存储混合类型项目?

javascript - 创建后分配对象原型(prototype)

inheritance - 我怎样才能在 Perl 6 中重新启用一个对象?

python - 多重继承: only 1 parent init'd

c++ - 嵌入式 C++ 编译器不支持多重继承的实例?

c++ - 我怎样才能在 C++ 中解决这个中值编程问题

c++ - 将两个 VS2010 C++ 项目构建到同一个输出文件夹中

c++ - Hippomock 的 MockRepository::BasicRegisterExpect 中的 NotImplementedException

具有父构造函数参数的 Javascript 继承

python多重继承使用super将参数传递给构造函数